1、查询所有数据
数据准备
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( {} )
#对应的SQL语句为:
SELECT * FROM inventory;
2、查询特定条件
#{ <field1>: <value1>, ... }
db.inventory.find( { status: "D" } ).pretty()
#对应的SQL语句为:
SELECT * FROM inventory WHERE status = "D";
3、使用查询运算符指定条件
3.1、查询比较操作符
“$lt”、"$lte"、"$gt"、"$gte"就是全部的比较操作符,分别对应<、<=、>和>=。
可以将其组合起来查找"qty"字段大于20,小于等于50的数据:
db.inventory.find( { qty: { $gt : 20, $lt : 50 } } ).pretty()
3.2、查询时间范围的数据
db.human.find({"born_time":{"$gte":ISODate("2000-07-01T08:38:38Z"),"$lte": ISODate("2019-10-09T08:38:38Z")},"gender":1} ).pretty()
3.2、查询$in操作符
$in可以查询一个键的多个值;
#{ <field1>: { <operator1>: <value1> }, ... }
#检索status为“A”或"D"的所有文档
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
#注意
#尽管可以使用$ or运算符表示此查询,但是在同一字段上执行相等性检查时,请使用$ in运算符而不是$ or运算符
#对应的SQL语句为:
SELECT * FROM inventory WHERE status in ("A", "D");
4、使用AND条件检索
复合查询可以为集合文档中的多个字段指定条件。 隐式逻辑AND连接复合查询的子句,以便该查询选择集合中符合所有条件的文档。
以下示例检索状态为“ A”且数量小于($ lt)30的清单集合中的所有文档:
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
#对应的SQL语句为:
SELECT * FROM inventory WHERE status = "A" AND qty < 30;
4、使用OR条件检索
使用$ or运算符,您可以指定一个复合查询,该查询将每个子句与一个逻辑或连接相连接,以便该查询选择集合中至少匹配一个条件的文档。
下面的示例检索状态为“ A”或数量小于($ lt)30的集合中的所有文档:
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
#对应的SQL语句为:
SELECT * FROM inventory WHERE status = "A" OR qty < 30;
4、使用OR、AND条件检索
在以下示例中,复合查询文档选择状态为“ A”且qty小于($ lt)30或item以字符p开头的集合中的所有文档:
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
#对应的SQL语句为:
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
5、模糊查询
查询包含XXX
db.inventory.find({item:/xxx/})
查询以XXX开头
db.inventory.find({item:/^xxx/})
查询以XXX结尾
db.inventory.find({item:/xxx^/})
查询忽略大小写
db.inventory.find({item:/xxx/i})
6、查询一条文档
db.collection.findOne()
#db.collection.findOne()方法还执行读取操作以返回单个文档。 在内部,db.collection.findOne()方法是db.collection.find()方法的limit为1。
7、查询嵌套文档
数据准备
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" }
]);
7.1、匹配嵌入/嵌套文档
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
#注意嵌套文档内部的字段顺序,例如,以下查询与集合的任何文档都不匹配:
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )
7.2、查询嵌套字段
要在嵌入式/嵌套文档中的字段上指定查询条件,请使用点符号"field.nestedField"。
注意:
使用点符号查询时,字段和嵌套字段必须在引号内。
在嵌套字段上指定相等匹配
以下示例选择嵌套在size字段中的uom字段等于“ in”的所有文档:
db.inventory.find( { "size.uom": "in" } )
7.3、多条件查询嵌套字段
以下查询选择嵌套字段size.h小于15,嵌套字段size.uom等于“ in”,字段status等于“ D”的所有文档:
db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
8、查询一个数组字段
数据准备
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 ] }
]);
8.1、匹配数组
要在数组上指定相等条件,请使用查询文档{< field >:< value >},其中是要匹配的精确数组,包括元素的顺序。
下面的示例查询所有文档,其中字段标签值是按指定顺序恰好具有两个元素(“ red”和“ blank”)的数组:
db.inventory.find( { tags: ["red", "blank"] } )
相反,如果您希望找到一个同时包含元素“ red”和“ blank”的数组,而不考虑顺序或该数组中的其他元素,请使用$all运算符:
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
8.2、查询数组中的元素
要查询数组字段是否包含至少一个具有指定值的元素,请使用过滤器{< field >:< value >},其中< value >是元素值。
以下示例查询所有文档,其中tag是一个包含字符串“ red”作为其元素之一的数组:
db.inventory.find( { tags: "red" } )
要在数组字段中的元素上指定条件,请在查询过滤器文档中使用查询运算符:
{< array field>:{< operator1>:< value1>,…}}
例如,以下操作查询数组dim_cm包含至少一个值大于25的元素的所有文档。
db.inventory.find({dim_cm:{$ gt:25}})
8.3、使用数组元素上的复合过滤条件查询数组
以下示例查询文档,其中dim_cm数组包含某种组合满足查询条件的元素; 例如,一个元素可以满足大于15的条件,而另一个元素可以满足小于20的条件,或者单个元素可以满足以下两个条件:
db.inventory.find({dim_cm:{$gt:15,$lt:20}})
8.4、查询满足多个条件的数组元素
使用$ elemMatch运算符可在数组的元素上指定多个条件,以使至少一个数组元素满足所有指定的条件。
以下示例查询在dim_cm数组中包含至少一个同时大于($ gt)22和小于($ lt)30的元素的文档:
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
8.5、通过数组索引位置查询元素
使用点表示法,可以为元素在数组的特定索引或位置处指定查询条件。 该数组使用基于零的索引。
注意:
使用点符号查询时,字段和嵌套字段必须在引号内。
以下示例查询数组dim_cm中第二个元素大于25的所有文档:
db.inventory.find({“dim_cm.1”:{$gt:25}})
8.6、通过数组长度查询数组
使用$ size运算符可按元素数量查询数组。
例如,以下选择数组标签具有3个元素的文档。
db.inventory.find({“ tags”:{$size:3}})
9、查询数组Document
数据准备
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 } ] }
]);
9.1、查询嵌套在数组中的Document文档
下面的示例选择库存数组中的元素与指定文档匹配的所有文档:
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
整个嵌套文档上的相等匹配要求与指定文档(包括字段顺序)完全匹配。
例如,以下查询与库存集中的任何文档都不匹配:
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
9.2、在文档数组中的字段上指定查询条件
如果您不知道嵌套在数组中的文档的索引位置,请使用点(.)和嵌套文档中的字段名称将数组字段的名称连接起来。
下面的示例选择所有数组中包含值小于或等于20的字段qty的文档:
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
9.3、设置数组索引以查询数组文档中的字段
使用点符号,可以为文档中特定索引或数组位置的字段指定查询条件。 该数组使用基于零的索引。
注意:
使用点符号查询时,字段和索引必须在引号内。
下面的示例选择所有数组的第一个元素是包含值小于或等于20的字段qty的文档:
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
9.4、单个数组文档在嵌套字段上满足多个查询条件
使用$elemMatch运算符可在一组嵌套文档上指定多个条件,以使至少一个嵌套文档满足所有指定条件。
下面的示例查询库存数组中至少有一个嵌套文档的文档,这些文档包含qty等于5的字段且warehouse等于A的字段:
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
下面的示例查询库存数组中至少有一个文档的qty字段大于10且小于或等于20:
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
9.5、满足条件的元素的任意组合
如果数组字段上的复合查询条件未使用$elemMatch运算符,则查询将选择其数组包含满足条件的元素的任意组合的那些文档。
例如,数组中的文档的qty字段可以满足大于15的条件,而另文档的qty字段可以满足小于20的条件,或者单个文档的qty字段可以满足以下两个条件:
db.inventory.find({“instock.qty”:{$gt:10,$lte:20}})
以下示例查询的文档中,instock数组可以满足条件字段qty等于5的嵌入文档,或者可以满足条件字段仓库等于A的嵌入文档(但不一定是相同的文档),或者满足两个条件:
db.inventory.find({“instock.qty”:5,“instock.warehouse”:“A”})