目前,我正在使用MongoCollection<Document>获取所有文档,返回类型为FindIterable<Document>,然后循环遍历 Iterable 来处理每个文档。
前任:
FindIterable<Document> docs = getCollection().find();
for(Document doc : docs) {
...
}
Run Code Online (Sandbox Code Playgroud)
但我不知道 FindIterable 是否会加载所有文档并循环它,或者只是加载游标并稍后在循环时获取文档?
您要求的是 Mongo Java 驱动程序的实现细节,因此不是公共接口的一部分,因此不能保证在未来版本中保持不变。
撇开这个免责声明不谈,从 3.2.x 开始,find() 调用在底层创建了一个 FindOperationIterable,它使用 MongoBatchCursorAdapter 作为其迭代器,而迭代器又基于 BatchCursor。
批处理游标中的 javadoc 指出:
“MongoDB 以批次形式返回查询结果,该接口提供了这些批次的迭代器。第一次调用 next 方法将返回第一批结果,后续调用将触发获取下一批结果的请求。客户端可以控制通过在调用 next 之间设置 batchSize 属性来设置批量大小。”
因此,它会分批读取结果,如果当前批次已读取完毕,则再次查询数据库。