'explain'에 해당되는 글 1건
- 2015.11.17 :: mongdb sort, paging, plan
개발관련/MongoDB
2015. 11. 17. 11:51
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //sort //asc db.crudtest.find( { } ).sort( { "name" : 1 } ); //desc db.crudtest.find( { } ).sort( { "name" : -1 } ); | cs |
sort는 sort라는 내부함수로 쓰며 1, -1로 오름 차순과 내림차순을 정한다.
다음은 다량의 데이터를 넣는 bulk 또는 fetch 또는 batch 다. (용어는 =_=; 쓰기나름. )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | db.users.insert( [ { "_id": "56497019adbf20c07138d982", "index": 0, "isActive": false, "age": 24, "eyeColor": "blue", "name": "Moon Robles", "gender": "male", "company": "MANTRIX", "email": "moonrobles@mantrix.com" }, { "_id": "56497019be3cc168feb7b889", "index": 1, "isActive": true, "age": 32, "eyeColor": "blue", "name": "Annabelle Bass", "gender": "female", "company": "FOSSIEL", "email": "annabellebass@fossiel.com" }, ////////////////////생략///////////////////////////////// { "_id": "564970199f18e80dce7f2fed", "index": 99, "isActive": false, "age": 32, "eyeColor": "brown", "name": "Richardson Hansen", "gender": "male", "company": "AQUASURE", "email": "richardsonhansen@aquasure.com" } ] ); | cs |
insert문에 array형태로 넣으면 된다. 현재 robomongo tool에 의해 작업하므로 file load는 커널에서만 가능 하다.
다음은 paging 기법.
1 2 3 | /////////////////////paging////////////////////////////// db.users.find().limit(10); db.users.find().skip(10).limit(10); | cs |
몇개의 결과를 가져올지에 대한 함수는 limit(count) 이며, 몇개를 skip할지에 대한 함수는 skip함수를 쓰면된다.
다음은 색인 작업.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //////////////////////index////////////////////////////////// db.users.ensureIndex( { "index" : 1 } ); db.users.ensureIndex( { "email" : 1 } ); //compound db.users.ensureIndex( { "email" : 1, "index" : 1 } ); | cs |
복합(?) 인덱스의 경우 위의 예제처럼 사용 하면 된다.
다음은 plan 또는 explain ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ///////////////////plan//////////////////////// db.users.find( { "index":{ $lte : 50 } } ).explain(); db.users.find( { $and :[ { "index" : { $lte :50 } }, { "name": "Joseph Ferguson" }, { "email" : "josephferguson@exiand.com" } ] } ).explain(); | cs |
위 두개의 plan을 해본 쿼리 문이다. 이것의 결과는 상당히 만족 스럽게 나온다. (plan까지 지원하다니 ....)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | /* 1 */ { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test2.users", //어느 db의 어느 collection 인지. "indexFilterSet" : false, "parsedQuery" : { //실행된 쿼리 "index" : { "$lte" : 50.0000000000000000 } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { //index를 탔을때 쿼리가 실행되는 단계를 나타냄. "stage" : "IXSCAN", //인덱스를 통해서 검색. /** * COLLSCAN for a collection scan IXSCAN for scanning index keys FETCH for retrieving documents SHARD_MERGE for merging results from shards */ "keyPattern" : { "index" : 1.0000000000000000 }, "indexName" : "index_1", "isMultiKey" : false, //compound 키 사용 여부. "direction" : "forward", "indexBounds" : { "index" : [ "[-inf.0, 50.0]" ] } } }, "rejectedPlans" : []//인텍스가 여러개일 경우 색인하지 않을 인덱스 값의 이름이 들어있다. }, "executionStats" : { "executionSuccess" : true, "nReturned" : 51,//document 개수 "executionTimeMillis" : 0,//실행 시간 "totalKeysExamined" : 51, //검색에 사용한 index를 통해서 개수. "totalDocsExamined" : 51, //collection에서 검색한 개수. "executionStages" : { "stage" : "FETCH", "nReturned" : 51, // return 된 document 수. "executionTimeMillisEstimate" : 0, "works" : 52, "advanced" : 51, "needTime" : 0, "needFetch" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "docsExamined" : 51, "alreadyHasObj" : 0, "inputStage" : { "stage" : "IXSCAN", "nReturned" : 51, "executionTimeMillisEstimate" : 0, "works" : 52, "advanced" : 51, "needTime" : 0, "needFetch" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "keyPattern" : { "index" : 1.0000000000000000 }, "indexName" : "index_1", "isMultiKey" : false, "direction" : "forward", "indexBounds" : { "index" : [ "[-inf.0, 50.0]" ] }, "keysExamined" : 51, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0, "matchTested" : 0 } }, "allPlansExecution" : [] }, "serverInfo" : { "host" : "localhost", "port" : 35001, "version" : "3.0.4", "gitVersion" : "0481c958daeb2969800511e7475dc66986fa9ed5" } } | cs |
위 결과는 첫번째 예제를 실행 할때 나오는 결과 인데.. 중요한 key들이 몇개 보인다.
state 경우 값이 COLLSCAN 인경우는 index를 타지 않았을 경우 값이 찍히고, 탔을 경우 IXSCAN 요런 값이 찍히게 된다.
또 위 두번째 예제를 실행하면 rejectedPlans 에 key에 단일 색인 키들이 들어 갈것이다. 위 주석을 보고 참고 하면 된다.