Mongo with java - 使用batchsize查找查询

Pin*_*884 4 java mongodb

我在 mongodb 中使用 java 在批处理设置为 500 的集合上执行 find 查询。我的集合有 10,000 条记录,但设置了批处理大小后我只得到 1-500 条记录。我如何获得下一组记录?

下面是代码片段

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

gly*_*ing 6

DBCursor让您遍历集合的那些被认为有关的文件query,以传递到find()方法。它从底层数据库中以batchSize单位懒惰地获取这些文档。

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

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

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

你说...

我的收藏有 10,000 条记录,但设置了批量大小后,我只能得到 1-500 条记录

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

您可以使用该count()方法查看与您的查询相关的文档数量。例如:

int count = collection.find(query).count();
Run Code Online (Sandbox Code Playgroud)

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

List<DBObject> obj = collection.find(query).toArray();
Run Code Online (Sandbox Code Playgroud)

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