我在 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/