Mongodb文档由BSON键值对构成。BSON键值对中值的类型,允许字符串,数字,数组,文档类型等。本文基于Mongodb的官方文档,对嵌套文档的查询进行整理,以供参考。
首先,构造出本文中使用到的查询数据。如果已经创建,请忽略。
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" }
]);
这里创建了一个带有5条数据的集合inventory。数据中包含字符类型的字段item和status,数字类型的字段qty和文档类型的对象size。其中size文档中,包含数字类型的字段h和w,还有一个字符类型的字段uom,表示数字的单位。
这里针对size字段来查询文档。
使用点操作符,指定嵌套文档对象的查询过滤条件。
查询size字段中uom是"in"的文档。使用点操作符,指定size字段中uom字段是"in"
db.inventory.find({"size.uom": "in"})
查询过滤条件可以通过查询操作符指定查询条件。按照下面的形式,使用查询操作符。
{<field1>: {<operater1>: <value1>},... }
如查询size字段中,h值大于15的数据
db.inventory.find({"size.h": {$lt: 15}})
同样,也可以使用$and, $or等操作符,构建复杂的查询条件。如构建一个隐式的$and查询,查询出符合下面三个条件的数据。
db.inventory.find( {"size.h": {$lt: 15}, "size.uom": "in", status: "D"})
在查询过滤文档中,向指定字段中传入文档对象,即要求查询出符合指定文档的数据。
如下面的代码中,要求查询出size字段符合文档对象{ h:14, w:21, uom: "cm"}的数据。
db.inventory.find({size: {h:14, w:21, uom: "cm"}})
这种方式可以查询出符合文档内容的数据。但mongodb不推荐这种使用方式。这种查询方式,要求文档严格匹配查询条件,即使查询条件中指定文档顺序改变,也午饭查询出具有相同字段的文档。只能查询出符合指定文档顺序的文档。如下面的查询语句,因为h字段和w字段的顺序改变,无法查询出数据
db.inventory.find({size: {w:21, h:14, uom: "cm"}})