MongoDB内嵌文档的查询
文章目录
可以使用下面几种方法查询MongoDB中的嵌入文档:
- 编程语言的驱动程序,比如:Java、Python灯。
- MongoDB Atlas UI。
- MongoDB Compass。
- 其他第三方工具。
下面的示例使用mongosh的db.collection.find()方法对内嵌/嵌套文档进行查询,如果使用其他编程语言或驱动,写法会有不同。
首先,使用下面的语句创建inventory
数据集:
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
使用点号.
查询内嵌文档
要对嵌入/嵌套文档中的字段指定查询条件,可使用点符号(“field.nestedField”)。使用点表示法查询时,字段和嵌套字段必须在引号内,
嵌套字段的相等匹配
db.inventory.find( { "size.uom": "in" } )
使用查询操作符进行匹配
{ <field1>: { <operator1>: <value1> }, ... }
下面的查询对嵌入在大小字段中的字段h
使用小于运算符$lt
:
db.inventory.find( { "size.h": { $lt: 15 } } )
指定AND条件
下面的查询选择嵌套字段h
小于15
、嵌套字段uom
等于"in"、状态字段等于"D"的所有文档:
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
嵌套文档的匹配
可使用查询过滤器文档{ <field>: <value> }
在嵌套文档的字段上指定相等条件,其中<value>
是要匹配的文档。
例如,下面的查询选择字段size
等于文档{ h: 14, w: 21, uom: "cm" }
的所有文档:
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
MongoDB不建议对内嵌文档进行相等匹配,因为需要指定的<value>
文档的精确匹配,包括字段顺序。
例如,以下查询与inventory
集合中的任何文档均不匹配:
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )
当与不使用有序数据结构表达查询的驱动程序一起使用时,对内嵌文档使用相等匹配的查询结果是未定义的。
使用 MongoDB Atlas 查询内嵌文档
查询MongoDB Atlas中的文档数组,可按照以下步骤操作:
导航至集合
- 在 MongoDB Atlas UI 中,单击侧栏中的数据库。
- 对于包含样本数据的数据库部署,单击浏览集合。
- 在左侧导航窗格中,选择
sample_training
数据库。 - 选择
grades
集合。
指定查询过滤文档
为Filter字段指定查询过滤文档。查询过滤文档使用查询运算符来指定搜索条件。
把下面的查询过滤器文档直接复制到过滤器搜索栏中:
{ scores: { type: "exam" } }
点击应用
查询过滤器返回sample_training.grades
集合中的所有文档,其中scores
字段包含考试分数类型。