进入MongoDB中文手册(4.2版本)目录
本章节提供了使用MongoDB Java Synchronous Driver中的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 匹配嵌入/嵌套文档
请使用过滤器文档 eq( , )为嵌入/嵌套文档的字段指定相等条件,其中的是文档要匹配的值。
例如,以下查询选择字段size等于文档{ h: 14, w: 21, uom: “cm” }的所有文档:
FindIterable<Document> findIterable = collection.find(eq("size", Document.parse("{ h: 14, w: 21, uom: 'cm' }")));
整个嵌入式文档上的相等匹配要求与指定文档(包括字段顺序)完全匹配。例如,以下查询与inventory集合中的任何文档都不匹配 :
findIterable = collection.find(eq("size", Document.parse("{ w: 21, h: 14, uom: 'cm' }")));
2 查询嵌套文档字段
要在嵌入式/嵌套文档中的字段上指定查询条件,请使用点号(“field.nestedField”)。
提示
使用点符号查询时,字段和嵌套字段必须在引号内。
2.1 在嵌套字段的相等匹配
下面的示例查询嵌套在size字段中的uom等于"in"的所有文档:
findIterable = collection.find(eq("size.uom", "in"));
2.2 使用查询运算符匹配
除了相等条件外,MongoDB还提供各种查询运算符来指定过滤条件。
使用 com.mongodb.client.model.Filters帮助器方法可以简化过滤器文档的创建。例如:
and(gte(<field1>, <value1>), lt(<field2>, <value2>), eq(<field3>, <value3>))
以下查询在size字段中嵌入的h字段上使用小于运算符($lt):
findIterable = collection.find(lt("size.h", 15));
2.3 指定AND条件
以下查询嵌套字段h小于15,嵌套字段uom等于"in"和 status字段等于"D"的所有文档:
findIterable = collection.find(and(
lt("size.h", 15),
eq("size.uom", "in"),
eq("status", "D")
));
3 其他查询教程
有关其他查询示例,请参见:
- 查询文件;
- 查询数组;
- 查询嵌入式文档数组。