目录
进入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 其他方法
以下方法也可以从集合中读取文档:
- 在聚合管道( aggregation pipeline)中,$match管道阶段提供对MongoDB查询的访问。请参阅Java同步驱动程序聚合示例。