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

时间:2015-03-22 07:18:49

标签: mongodb mongodb-query spring-data-mongodb spring-mongo spring-mongodb

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

所以有两个问题:

  • 通过不将所有内容加载到内存中来提高性能
  • 您如何解决处理过程中添加的未知文件?

API的代码

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

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

1 个答案:

答案 0 :(得分:1)

  

通过不将所有内容加载到内存中来提高性能

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

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

  

您如何解决处理过程中添加的未知文件?

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

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