我正在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"));
}
答案 0 :(得分:1)
DBCursor
允许您迭代与query
相关的文档集,以传递到find()
方法。它懒洋洋地从 batchSize 的块中的底层数据库中提取这些文档。
因此,使用默认批量大小(101,IIRC),它会将前101个文档返回给您的客户端,然后当您的客户端代码超出第101个文档时,它将(在幕后)获取下一个101个文档,因此直到下面出现以下任何一个:
同样适用于设置显式 batchSize 的情况,因此在您设置batchSize=500
的情况下,find()
调用返回包含DBCursor
的{{1}}大多数)500个文档,如果有超过500个文档与您的查询匹配,那么当您迭代超过第500个文档时,MongoDB Java驱动程序将(在幕后)获取下一批文档。
你说......
我的收藏有10,000条记录,但是使用batchsize设置我只获得1-500条记录
...如果您只获得500份文件,则要么在500后停止迭代,要么只有500份文件被认为与您的query
相关。
您可以使用count()
方法查看与查询相关的文档数量。例如:
int count = collection.find(query).count();
您也可以一次性获取与您的查询相关的所有文档,而无需使用此类DBCursor
...
List<DBObject> obj = collection.find(query).toArray();
...当然,这可能会对您的应用程序的堆产生影响,因为它会导致满足您的条件的每个文档都存储在客户端的堆上(而不是通过更多内存友好的方式批量读取它们) DBCursor
)。
答案 1 :(得分:0)
您可以使用skip
方法来实现此目的:
像:
collection.find(query).batchSize(batchSize).skip(500)