查询文档


进入MongoDB中文手册(4.2版本)目录

本章节提供了使用MongoDB Java同步驱动程序中的com.mongodb.client.MongoCollection.find方法进行查询操作的示例。

提示
该驱动程序提供com.mongodb.client.model.Filters 帮助器方法,以帮助创建过滤器文档。本章节的示例使用这个方法来创建过滤器文档。

此页面上的示例使用inventory 集合。要填充inventory集合,请运行以下命令:

collection.insertMany(asList(
        Document.parse("{ item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' }"),
        Document.parse("{ item: 'notebook', qty: 50, size: { h: 8.5, w: 11, uom: 'in' }, status: 'A' }"),
        Document.parse("{ item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, status: 'D' }"),
        Document.parse("{ item: 'planner', qty: 75, size: { h: 22.85, w: 30, uom: 'cm' }, status: 'D' }"),
        Document.parse("{ item: 'postcard', qty: 45, size: { h: 10, w: 15.25, uom: 'cm' }, status: 'A' }")
));

1 查询集合中的所有文档

要选择集合中的所有文档,请将空文档作为查询过滤器参数传递给find方法。查询过滤器参数确定选择条件:

FindIterable<Document> findIterable = collection.find(new Document());

此操作对应于以下SQL语句:

SELECT * FROM inventory

有关该方法的语法的更多信息,请参见 com.mongodb.client.MongoCollection.find

2 指定相等条件

要指定相等条件,请使用 com.mongodb.client.model.Filters.eq_方法创建查询过滤器文档

and(eq( <field1>, <value1>), eq( <field2>, <value2>) ...)

以下示例从inventory集合中选择status等于"D"的所有文档:

findIterable = collection.find(eq("status", "D"));

此操作对应于以下SQL语句:

SELECT * FROM inventory WHERE status = "D"

3 指定条件下使用查询运算符

除了相等条件外,MongoDB还提供各种查询运算符来指定过滤条件。使用 com.mongodb.client.model.Filters帮助器方法可以简化过滤器文档的创建。例如:

and(gte(<field1>, <value1>), lt(<field2>, <value2>), eq(<field3>, <value3>))

以下示例从inventory 集合中检索status等于"A"或"D"的所有文档:

findIterable = collection.find(in("status", "A", "D"));

注意
尽管可以使用 o r 运 算 符 表 示 此 查 询 , 但 是 在 同 一 字 段 上 执 行 相 等 性 检 查 时 , 最 好 使 用 or运算符表示此查询,但是在同一字段上执行相等性检查时,最好使用 or使in运算符而不是$or运算符。

该操作对应于以下SQL语句:

SELECT * FROM inventory WHERE status in ("A", "D")

有关MongoDB查询运算符的完整列表,请参阅查询和投影运算符(Query and Projection Operators)文档。

4 指定AND条件

复合查询可以为集合文档中的多个字段指定条件。AND将复合查询的子句连接起来,以便该查询选择集合中符合所有条件的文档。
以下示例检索inventory集合中status等于"A" 和 qty小于30的所有文档:

findIterable = collection.find(and(eq("status", "A"), lt("qty", 30)));

该操作对应于以下SQL语句:

SELECT * FROM inventory WHERE status = "A" OR qty < 30

有关其他MongoDB比较运算符,请参阅比较操作(comparison operators )。

5 指定OR条件

使用$or运算符,您可以指定一个复合查询,OR将每个子句与一个逻辑连接符连接在一起,以便该查询选择集合中至少匹配一个条件的文档。
以下示例检索集合中status等于"A" 或 qty小于30的所有文档:

findIterable = collection.find(or(eq("status", "A"), lt("qty", 30)));

该操作对应以下SQL语句:

SELECT * FROM inventory WHERE status = "A" OR qty < 30

注意
使用比较运算符( comparison operators)的查询同时需要考虑类型的比较(Type Bracketing)。

6 同时指定AND和OR条件

在下面的例子中,复合查询文档中查询集合中的所有文档,其中status等号"A" 和 任一 qty小于30 或 item以p字符开始:

findIterable = collection.find(
        and(eq("status", "A"),
                or(lt("qty", 30), regex("item", "^p")))
);

该操作对应于以下SQL语句:

SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")

注意
MongoDB支持正则表达式$regex查询,以执行字符串模式匹配(string pattern matches)。

7 其他查询教程

有关其他查询示例,请参见:

  • 查询嵌入/嵌套文档;
  • 查询数组;
  • 查询嵌入式文档数组;
  • 从查询返回的项目字段;
  • 查询空字段或缺少字段。

8 行为

8.1 游标

com.mongodb.client.MongoCollection.find方法返回的一个com.mongodb.client.FindIterable接口的实例

8.2 读隔离

3.2版中的新功能。
对于对副本集和副本集分片的读取,读策略使客户端可以为其读取选择隔离级别。有关更多信息,请参见阅读策略(Read Concern)的内容。

8.3 其他方法

以下方法也可以从集合中读取文档:

进入MongoDB中文手册(4.2版本)目录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值