文档菜单
文档首页
/ / /
Java 同步驱动程序
/ / /

从游标访问数据

本页内容

  • 概述
  • 终端方法
  • 第一
  • 结果数量
  • 进入
  • 游标
  • 说明
  • 使用模式
  • 功能迭代
  • 条件迭代
  • 游标清理
  • 关闭
  • 使用资源语句

在本指南中,您可以学习如何使用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文档

MongoCursorFindIterable 允许您逐个访问查询结果,从而抽象出网络和缓存逻辑。

将函数传递给 FindIterableforEach() 方法,以函数式风格遍历结果

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文档

返回

检索数据