Windows 7 64 SP1 -- MongoDB 2.2.0-rc2 -- Boost 1.42 -- MS VS 2010 Ultimate -- C++ ドライバー
「Mongo in Action」に従って、シェルで:
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++ で複製する場合:
// 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 }
{"num" : 0} の _id は、{"num" : 199924} の _id の前にあります
そして、「_id」のインデックスが存在します:
> 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 でコレクションのインデックスを使用していないように見えるのはなぜですか? または、この明らかな異常を他に説明するものは何ですか (または私の理解の欠如?