从游标访问数据
Overview
在本指南中,您可以了解如何通过 MongoDB Java 驱动程序使用游标访问数据。
游标是一种机制,允许应用程序迭代数据库结果,同时在给定时间仅在内存中保存其中的子集。 驱动程序在匹配多个文档的读取操作中使用游标来进行批处理返回匹配的文档,而不是一次性返回所有文档。
本页使用启动方法find()
展示如何访问权限来自 FindIterable 的数据。
注意
以下访问和存储数据的方法适用于其他可迭代对象,例如 AggregateIterable。
find()
方法创建并返回FindIterable
的实例。 FindIterable
允许您浏览与Atlas Search条件匹配的文档,并通过方法设置参数来进一步指定要查看的文档。
终端方法
在配置控制操作的Iterable
实例的所有参数后,终端方法对 MongoDB 部署执行操作。
first
使用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
使用into()
方法将查询结果存储在List
中:
List<Document> results = new ArrayList<>(); FindIterable<Document> iterable = collection.find(); iterable.into(results); System.out.println(results);
当查询筛选器返回少量可容纳在可用内存中的文档时,通常会使用此方法。
Cursor
使用cursor()
方法遍历获取的文档,并确保游标在提前终止时关闭:
MongoCursor<Document> cursor = collection.find().cursor();
有关如何确保游标关闭的更多信息,请参阅游标清理部分。
解释
使用explain()
方法查看有关 MongoDB 如何执行操作的信息。
explain()
方法会返回执行计划和性能统计信息。 执行计划是 MongoDB 完成操作的一种潜在方式。 explain()
方法提供获胜计划(MongoDB 执行的计划)和被拒绝的计划。
您可以通过将详细程度传递给 explain()
方法来指定说明的详细程度。
下表显示了说明的所有详细级别及其预计使用案例:
详细程度 | 用例(Use Case) |
---|---|
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 文档: