从游标访问数据
概述
在本指南中,您可以学习如何使用MongoDB Java驱动程序通过游标访问数据。
游标是一种机制,允许应用程序在给定时间内只将数据库结果的一部分保持在内存中,从而迭代数据库结果。驱动程序在匹配多个文档的读取操作中使用游标,批量返回匹配的文档,而不是一次性返回所有文档。
本页使用一个启动方法,find()
来展示如何从FindIterable.
注意
以下访问和存储数据的方法适用于其他可迭代对象,例如 AggregateIterable。
find()
方法创建并返回一个 FindIterable
实例。一个 FindIterable
允许您浏览与您的搜索条件匹配的文档,并通过设置通过方法传递的参数来进一步指定要查看的文档。
终端方法
终端方法在配置好控制操作的Iterable
实例的所有参数后,对MongoDB部署执行操作。
首先
使用first()
方法检索查询结果中的第一个文档
FindIterable<Document> iterable = collection.find(); System.out.println(iterable.first());
此方法通常用于查询过滤器将匹配一个文档的情况,例如按唯一索引进行筛选。
结果数量
使用available()
方法检索本地存在的结果数量,而不阻塞
MongoCursor<Document> cursor = collection.find().cursor(); System.out.println(cursor.available());
如果应用程序已经迭代过游标中的所有文档或游标已关闭,则此方法返回0
。
进入
使用into()
方法将查询结果存储在List
中
List<Document> results = new ArrayList<>(); FindIterable<Document> iterable = collection.find(); iterable.into(results); System.out.println(results);
此方法通常用于查询过滤器返回的文档数量较少,可以适应可用内存的情况。
光标
使用 cursor()
方法遍历获取的文档,并确保在提前终止的情况下关闭光标
MongoCursor<Document> cursor = collection.find().cursor();
有关确保光标关闭的更多信息,请参阅光标清理部分。
解释
使用 explain()
方法查看MongoDB执行您的操作的信息。
explain()
方法返回 执行计划 和性能统计信息。执行计划是MongoDB完成操作的一种潜在方式。explain()
方法提供了获胜计划(MongoDB执行的计划)和拒绝的计划。
您可以通过向 explain()
方法传递详细程度来指定解释的详细程度。
以下表格显示了所有解释详细程度及其用例
详细程度级别 | 用例 |
---|---|
ALL_PLANS_EXECUTIONS | 您想了解MongoDB将选择哪个计划来运行您的查询。 |
EXECUTION_STATS | 您想了解您的查询是否运行良好。 |
QUERY_PLANNER | 您在查询中遇到问题,您需要尽可能多的信息来诊断问题。 |
以下示例打印出聚合阶段产生执行计划的获胜计划的JSON表示
Document explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS); List<String> keys = Arrays.asList("queryPlanner", "winningPlan"); System.out.println(explanation.getEmbedded(keys, Document.class).toJson());
前面的代码片段产生以下输出
{ "stage": "COLLSCAN", "direction": "forward" }
有关解释操作的更多信息,请参阅以下服务器手册条目
有关本节中提到的方法和类的更多信息,请参阅以下API文档
使用模式
MongoCursor
和 FindIterable
允许您逐个访问查询结果,从而抽象出网络和缓存逻辑。
函数式迭代
将函数传递给 FindIterable
的 forEach()
方法,以函数式风格遍历结果
FindIterable<Document> iterable = collection.find(); iterable.forEach(doc -> System.out.println(doc.toJson()));
重要
初始化方法返回实现 Iterable
接口的对象,这允许您使用迭代器方法遍历它们。有时,我们使用增强型 for-each 循环遍历结果
for (Document cursor : collection.find()) { ... }
以这种方式迭代是不推荐的,因为如果在循环完成之前抛出异常,游标将不会关闭。使用 MongoCursor
允许我们确保游标按 游标清理部分 所示关闭。
条件迭代
使用 hasNext()
方法检查游标中是否有任何文档可用,然后使用 next()
方法从游标中检索下一个可用的文档
MongoCursor<Document> cursor = collection.find().cursor(); while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); }
有关本节中提到的方法和类的更多信息,请参阅以下API文档
光标清理
关闭
在 finally
块中使用 close()
方法来释放光标在客户端应用程序和 MongoDB 部署中的资源消耗
MongoCursor<Document> cursor = collection.find().cursor(); try { while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); } } finally { cursor.close(); }
尝试使用资源语句
使用 try-with-resources 语句自动释放光标在客户端应用程序和 MongoDB 部署中的资源消耗
try(MongoCursor<Document> cursor = collection.find().cursor()) { while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); } }
有关本节中提到的方法和类的更多信息,请参阅以下API文档