我在 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)
将DBCursor让您遍历集合的那些被认为有关的文件query,以传递到find()方法。它从底层数据库中以batchSize为单位懒惰地获取这些文档。
因此,使用默认批量大小 (101, IIRC) 它将前 101 个文档返回给您的客户端,然后当您的客户端代码迭代超出第 101 个文档时,它将(在幕后)抓取接下来的 101 个文档,依此类推,直到首先发生以下情况:
当您设置显式batchSize时同样适用,因此在您设置的情况下batchSize=500,find()调用返回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)。
| 归档时间: |
|
| 查看次数: |
6496 次 |
| 最近记录: |