捕获在 Mongodb 中的大查找查询期间添加的未知文档

Capture unknown document added during big find query in Mongodb

我想知道 Spring Mongo API 因为 find 加载了 List 中的所有内容。如果搜索结果包含十亿条记录,是否会影响内存?有人可以建议一种更好的方法来实现这一点,而无需将所有这些都加载到内存中。使用 limit 可以提供帮助,但存在一个缺陷,即它不知道集合中是否插入了新文档。好吧,如果集合在读取 X of billion 条记录后发生修改,则按限制查找会产生相同的效果。

所以两个问题:

代码来自 API

List<T> result = new ArrayList<T>();

while (cursor.hasNext()) {
    DBObject object = cursor.next();
    result.add(objectCallback.doWith(object));
}

Improve performance by not loading everything in memory

搜索结果的相应用户界面通常会限制需要显示的结果数量(例如每页结果以及总体结果)。我认为没有任何明智的用例可以将无限制的结果集加载到内存中,但是一个好的保护措施是在您的应用程序查询中包含一个合理的限制。

MongoDB 服务器 returns 查询结果为 cursor batches that cannot exceed the maximum BSON document size(在 MongoDB 3.0 时为 16MB .. 实际上,第一批通常为 1MB,后续批次为 4MB批)。您可以通过在应用程序代码中继续迭代游标来构建更大的结果,但实现是您的选择。

How would you solve this un-known document added during processing?

按 属性 个单调递增的新文档对搜索结果进行排序 -- 例如,默认生成的 ObjectId。游标(在 MongoDB 3.0 中)不提供与写入的隔离 activity,因此如果适用于查询顺序,在处理过程中插入或更新的文档也将包括在内。

如果您的代码迭代按 _id(升序)排序的大型查询,使用默认 ObjectId 插入的新文档应该出现在最后一批中。