MongoDB 查询

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”}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值