Mongo Shell 查询操作
mongodb 查询嵌入式文档数组
- 返回/不返回嵌套字段中的指定字段:
db.collection.find({"_id":1}, {"_id":1, "test.name": 1, "test.code": 0})
嵌套字段可通过.
来获取。 - 返回数组中指定的元素
db.collection.find({"_id" : ObjectId("621d8f04a932fa682cea2aa0")}, {"connect_tasks":{"$slice":-1}})
$slice
作用于数组字段。 - 查询嵌数组内的嵌套文档
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 }, { warehouse: "A", qty: 45 } ] }
]);
- 以嵌套文档为匹配条件
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
以文档为查询条件,返回所有数组内包含条件文档的集合文档
注意查询条件中嵌套文档内字段的顺序和数据库中嵌套文档的顺序也要保持一致,db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
的查询结果为空。 - 指定数组内嵌套文档的字段
以数组内文档内的某个字段为查询条件
db.inventory.find( { ‘instock.qty’: { $lte: 20 } } )
返回集合中所有满足数组内至少有一个文档的qty字段大于等于1的文档。 - 指定数组内某一个嵌套文档的字段
使用点号指明具体是数组的第几个嵌套文档的字段,确保索引和字段正确
db.inventory.find( { ‘instock.0.qty’: { $lte: 20 } } )
返回集合中所有满足数组的第一个嵌套文档的qty值>=1的文档。 - 指定嵌套文档的多字段进行查询
- 单个文档的字段满足多个查询条件
通过使用*$elemMatch操作符为文档指定多个查询条件,则要求返回的集合文档的数组中至少有一个嵌套文档满足所有的查询条件**,即返回的是所有查询条件结果的交集*db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
返回的是所有满足数组包含至少一个条件文档的集合文档
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] }
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
返回的是所有满足数组内至少有一个文档的qty元素大于10且小于等于20的集合文档
- 多个元素联合满足查询条件
如果对数组内文档的联合查询没有使用$elemMatch,查询返回数组中存在多个元素联合满足所有查询条件的集合文档db.inventory.find( { "instock.qty": { $gt: 40, $lte: 20 } } )
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 }, { warehouse: "A", qty: 45 } ] }
注:第一条数据是qty=60满足了条件lte:20;第二条数据是qty=15满足了条件gt:40。所以返回了这两条数据,插入的其他数据的嵌套文档均不能同时满足所有的查询条件,所以没有返回
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] }
注:返回的第一条数据,文档{ warehouse: “A”, qty: 5 }满足了查询条件;第二条数据,文档{ warehouse: “A”, qty: 40 }, { warehouse: “B”, qty: 5 }联合满足了查询条件,可观察其他的插入数据,其他的数据的嵌套文档不能联合满足查询条件
返回的是所有数组内至少一个文档包含qty=5或者最少一个文档包含warehouse=A的集合文档,相当于是两个查询条件的并集
mongodb 查询数组
- 练习用数据
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
,
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 17] }
]);
- 查询数组
直接对数组字段进行匹配,分为两种情况,一种是严格限制数组只包含查询的元素以及元素顺序;一种是数组的元素包含查询的元素且不限制元素的顺序或是否有其他元素,需要操作符*$all***db.inventory.find( { tags: ["red", "blank"] } )
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] }
db.invemtory.find({tags:{$all:["red","blank"]}})
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
- 查询数组中的元素
检索数组中至少有一个元素等于指定的值db.inventory.find({tags:"red"})
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
返回tags数组中至少有一个red元素的文档
db.inventory.find({ dim_cm : {$gt: 25} })
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
- 多条件查询数组中的元素
使用多条件查询数组时有两种情况:一是指定单个数组元素满足查询条件;二是多个数组中的元素联合满足查询条件
多条件查询数组元素,即数组中存在一个元素或多个元素能使得所有查询条件都被满足,相当于是拆分所有查询条件后,查询结果的交集db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 17] }
数组中的单个元素同时满足多个查询条件,即数组中至少存在一个元素同时满足所有的查询条件,使用操作符 $elemMatch
db.inventory.find({dim_cm : {$elemMatch :{$gt: 23, $lt: 30}}})
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
- 使用元素下标查询数组
db.inventory.find({ "dim_cm.0" : {$gt : 20}})
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
确保索引和字段正确
- 通过数组的大小来查询
使用 $size 操作符,此操作符参数只能是数字db.inventory.find({"tags" : {$size : 3)
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] }
mongodb 查询空字段或缺少字段
- 练习用数据
db.inventory.insertMany([
{ _id: 1, item: null },
{ _id: 2 }
])
- 等值匹配
使用 {item : null} 作为匹配条件,返回的是item字段不存在或者item字段存在但是值为null的文档db.inventory.find({item : null})
{ _id: 1, item: null },
{ _id: 2 }
- 类型检查
BSON Types — MongoDB Manualnull 的 BSON TYPE 是数字 10db.inventory.find({ item : { $type : 10} })
{ _id: 1, item: null },
此查询结果只返回item字段存在且值为null的文档
- 存在检查
db.inventory.find({ item : { $exists : false }})
{ _id: 2 }
db.inventory.find({ item : { $exists : true }})
{ _id: 1, item: null }
存在检查使用操作符 $exists , 参数为true/false,只判断字段是否存在,不关心字段的值,并返回符合要求的文档
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" }
]);
- 嵌套文档等值查询
对整个文档字段进行等值查询时,需要保证嵌套文档的字段不能缺失,且嵌套文档字段的顺序需要和数据库中嵌套文档的字段顺序保持一致db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )
是不会有返回值的。
- 嵌套文档中字段查询
- 对嵌套文档的字段等值查询
db.inventory.find( { "size.uom": "in" } )
{ 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" }
返回所有嵌套文档的uom字段为 in 的集合文档
- 对嵌套文档的操作符查询
db.inventory.find( { "size.h": { $gt: 15 } } )
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }
返回所有嵌套文档size中字段h的值大于15的文档
- 对嵌套文档中的字段进行多条件查询
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }