java - 带有java的Mongodb - 查找批量大小的查询

标签 java mongodb

我在 mongodb 中使用 java 在 batchsize 设置为 500 的集合上执行查找查询。我的集合有 10,000 条记录,但是 batchsize 设置后我只能得到 1-500 条记录。如何获取下一组记录?

下面是代码片段

DBCursor cursor = collection.find(query).batchSize(batchSize);
while(cursor.hasNext()) {
    // write to file.
    DBObject obj = cursor.next();
    objectIdList.add(obj.get("_id"));
}

最佳答案

DBCursor 允许您遍历被认为与query 相关的文档集以传递给find() 方法.它以 batchSize 的 block 从底层数据库中延迟获取这些文档。

因此,使用默认的批量大小(101,IIRC),它会将前 101 个文档返回给您的客户端,然后当您的客户端代码迭代超过第 101 个文档时,它将(在幕后)获取接下来的 101 个文档,依此类推直到以下情况先发生:

  • 返回与您的查询相关的所有文档,即游标已用完
  • 您的客户端停止迭代

当您设置显式 batchSize 时同样适用,因此在您设置 batchSize=500 的情况下,find() 调用返回DBCursor 包含(最多)500 个文档,如果有超过 500 个文档与您的查询匹配,那么当您迭代超过第 500 个文档时,MongoDB Java 驱动程序将(在幕后)获取下一批.

你说...

My collection has 10,000 records but with batchsize set i get only 1-500 records

...如果您只获得 500 个文档,那么要么在 500 个之后停止迭代,要么只有 500 个文档被认为与您的查询相关。

您可以使用 count() 方法查看有多少文档与您的查询相关。例如:

int count = collection.find(query).count();

您还可以一次获取与您的查询相关的所有文档,而无需像这样使用 DBCursor ...

List<DBObject> obj = collection.find(query).toArray();

... 虽然这当然可能会对您的应用程序的堆产生影响,因为它会导致满足您的条件的每个文档都存储在您的客户端的堆上(而不是通过更内存友好的方法批量读取它们DBCursor)。

关于java - 带有java的Mongodb - 查找批量大小的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46683581/

相关文章:

arrays - Mongoose 从数组中的数组中拉出对象

node.js - Mongoose 查找回调未执行

java - 在 HQL 中选择 distinct with group by 和 having

java - 正则表达式在 Guava 中不起作用

JavaFX "y"在 Canvas 上的位置

mongodb - mongoosejs 有什么好的引用吗?

java - 警报对话框中的上下文

java - 如何默默地取消bean的创建?

mongodb - 更新符合条件的所有字段值

javascript - 使用 mongodb Nodejs 进行异步循环