gpt4 book ai didi

mongodb - 使用 MongoDb C++ 驱动程序查询大型集合不同于 shell

转载 作者:可可西里 更新时间:2023-11-01 09:46:09 25 4
gpt4 key购买 nike

Windows 7 64 SP1 --MongoDB 2.2.0-rc2——升压 1.42 --MS VS 2010 终极版 --C++驱动

按照“Mongo in Action”,在 shell 中:

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 }
....

在 shell 中调用 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 上的集合索引?或者还有什么可以解释这种明显的异常现象(或者我缺乏理解?

最佳答案

索引和排序是不同的概念。您可以在索引中查找数据而无需对结果进行排序;您还可以在不使用索引的情况下对结果进行排序(尽管不推荐这样做)。

由于您没有为您的find() 指定排序顺序,结果将在natural order 中返回。 .对于您仅插入文档(从未删除或更新)的集合,自然顺序应该近似于插入顺序(除非您碰巧使用 capped collection ,它按插入顺序维护)。

一旦您开始删除文档或更新它们(这可能会导致它们被移动),就会在 MongoDB 的 preallocated data files 中创建可用空间“间隙” . MongoDB 将重用空闲空间用于新文档插入/移动。因此随着时间的推移,自然顺序将不再与插入顺序匹配。

如果您希望结果按特定的排序顺序排列,则必须将其包含在查询中。

关于mongodb - 使用 MongoDb C++ 驱动程序查询大型集合不同于 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com