使用java的Mongo - 使用batchsize查找查询

时间:2017-10-11 08:37:48

标签: 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"));
        }

2 个答案:

答案 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)