2012-09-08 6 views
3

윈도우 7 64 SP1 - MongoDB를 2.2.0-RC2 - 다음 C++ 드라이버쿼리 쉘과 다른

- MS VS 2010 궁극 - 1.42 부스트 셸에서 "액션 몽고", :

for(i=0; i<200000; i++){ 
    db.numbers.save({num: i}); 
} 

db.numbers.find() 표시 :

{ "_id": ObjectId("4bfbf132dba1aa7c30ac830a"),"num" : 0 } 
{ "_id": ObjectId("4bfbf132dba1aa7c30ac830b"),"num" : 1 } 
{ "_id": ObjectId("4bfbf132dba1aa7c30ac830c"),"num" : 2 } 
{ "_id": ObjectId("4bfbf132dba1aa7c30ac830d"),"num" : 3 } 
... 

그래서, 담당자 C++에서 licating :

// Insert 200,000 documents 
for (int i = 0; i < 200000 ; i++) 
    c.insert(dc,BSON(GENOID << "num" << i)); 

//Display the first 20 documents 
Query qu = BSONObj(); 
auto_ptr<DBClientCursor> cursor = c.query(dc,qu); 
for (int i = 0 ; i < 20 ; i++){ 
    cout << cursor->next().toString() << endl; 
} 

출력 :

{ "_id" : ObjectId("504bab737ed339cef0e26829"), "num" : 199924 } 
{ "_id" : ObjectId("504bab737ed339cef0e2682a"), "num" : 199925 } 
{ "_id" : ObjectId("504bab737ed339cef0e2682b"), "num" : 199926 } 
{ "_id" : ObjectId("504bab737ed339cef0e2682c"), "num" : 199927 } 
.... 

셸() db.numbers.find 호출하는 것은 동일한 출력을 갖는다. { "num": 0}으로 시작하는 이유는 무엇입니까? 그것은 존재합니다

> db.numbers.find({"num" : 0}) 
{ "_id" : ObjectId("504bab417ed339cef0df5b35"), "num" : 0 } 

는 대한 _id 존재 "_id"에

그리고 인덱스 { "NUM은": 0}됩니다에 대한 _id {199924 "NUM"} : 이전

> db.numbers.getIndexes() 
[ 
    { 
      "v" : 1, 
      "key" : { 
        "_id" : 1 
      }, 
      "ns" : "learning.numbers", 
      "name" : "_id_" 
    } 
] 
내가 읽어 쿼리 코드를 변경하여 _id에 의해 일종의 추가하면

:

auto_ptr<DBClientCursor> cursor = c.query(dc,qu.sort("_id")); 

는 다음 순서대로 인쇄 :

{ "_id": ObjectId("4bfbf132dba1aa7c30ac830a"),"num" : 0 } 
{ "_id": ObjectId("4bfbf132dba1aa7c30ac830b"),"num" : 1 } 
... 

이 문서의 (200 말) 작은 컬렉션 발생하지 않습니다.

질문 : 왜이 ​​C++ 쿼리 _id에 컬렉션의 인덱스를 사용하지 않는 것으로 나타 납니까?

답변

2

인덱스 및 정렬은 결과를 정렬하지 않고 인덱스에서 데이터를 찾을 수 있으며 인덱스를 사용하지 않고도 결과를 정렬 할 수 있습니다 (단, isn은 아님). 't)를 추천했다.

을 당신이 당신의 find()에 대한 정렬 순서를 지정하지 않은 때문에, 결과는 natural order에 반환됩니다. 당신은 단지 자연의 질서는 대략한다) 문서를 삽입하지 (결코 삭제하거나 업데이트 한 모음의 경우 (당신이 삽입 순서로 유지되는 capped collection를 사용하는 일이없는 한) 삽입 순서.

당신이 문서를 삭제하거나 MongoDB를의 preallocated data files에서 만든 자유 공간 "격차"가있을 것입니다 (그 이동 될 수 있습니다있는)을 업데이트 시작하면. MongoDB는 새로운 문서 삽입/이동을 위해 여유 공간을 재사용합니다. 그래서 자연 순서가 더 이상 삽입 순서와 일치하지 않게됩니다. 특정 정렬 순서의 결과를 기대하는 경우

, 당신은 당신의 쿼리에이를 포함해야합니다. 그 "차이"가 문제이며, 솔루션를 알려준 -

0

@stenni 감사합니다. 셸의 자연 순서는 쿼리 할 때 C++ 드라이버보다 더 자연스럽고, 후자는 매우 큰 "num"으로 시작합니다.그러나 결함은 내 방법론에 있습니다.

  1. 쉘에 200000 개의 문서를 삽입하십시오.
  2. db.numbers.find(); 나열된 첫 번째 문서이었다 {"num" : 0}
  3. db.numbers.remove()
  4. C++ 드라이버
  5. 삽입 200000 개 문서
  6. db.numbers.find(); 나열된 첫 번째 문서는 실제로 컬렉션을 삭제 db.numbers.drop()을 사용 뻔 대신 {"num" : SomeVeryLargeNumber}

했다. 그러면 5 단계의 첫 번째 문서는 {"num" : 0}입니다. db.numbers.remove은 분명히 간격을 유지합니다.