mongodb 基本操作:文档查询

基本查询

db.collection.find()  命令使用

先插入文档

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" }
]);

1、查询数据集所有文档

db.inventory.find( {} )

返回:

将空文档{}作为查询过滤条件,相当于sql:

SELECT * FROM inventory

更多用法详见:find()

2、指定相等匹配条件

使用以下表达式作为查询过滤条件:

{ <field1>: <value1>, ... }

如查询status字段值为D的文档:

db.inventory.find( { status: "D" } )

相当于sql:

SELECT * FROM inventory WHERE status = "D"

返回:

 

3、指定操作符作为条件(Operators)

按照以下格式:

{ <field1>: { <operator1>: <value1> }, ... }

例如找status 为A或者D的文档:

db.inventory.find( { status: { $in: [ "A", "D" ] } } )

尽管or也可以,但推荐用in,相当于sql:

SELECT * FROM inventory WHERE status in ("A", "D")

返回:

更多详见:Query and Projection Operators

 

4、指定 AND  条件

复合查询例如:

db.inventory.find( { status: "A", qty: { $lt: 30 } } )

查询status 为A且qty小于30的文档,相当于sql:

SELECT * FROM inventory WHERE status = "A" AND qty < 30

返回:

更多操作详见: comparison operators 

 

5、指定 OR 条件

例如:

db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

查询status =A 或qty小于30的文档,相当于sql:

SELECT * FROM inventory WHERE status = "A" OR qty < 30

返回:

 

and 和 or 一起上

db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

返回:

 

嵌入文档查询

1、嵌入文档匹配查询

db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

查询size字段内容等于:{ h: 14, w: 21, uom: "cm" } 的文档:

必须是精确匹配包括size对应的值内容的顺序

2、内层字段的查询

db.inventory.find( { "size.uom": "in" } )

精确匹配查询:查询size字段内uom字段内容为in的文档,返回:

 

操作符过滤查询,查询size字段内h字段小于15的文档:

db.inventory.find( { "size.h": { $lt: 15 } } )

返回:

 

and条件查询

db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )

 

数组查询

插入数据

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 ] }
]);

1、数组精确匹配

db.inventory.find( { tags: ["red", "blank"] } )

查询tags字段内容匹配的文档,返回

若查询tags包含red和blank,不考虑其他元素,可以用all:

db.inventory.find( { tags: { $all: ["red", "blank"] } } )

2、数组包含某元素的匹配

查询tags包含red:

db.inventory.find( { tags: "red" } )

3、操作符匹配

查询dim_cm 包含大于25的元素的文档:

db.inventory.find( { dim_cm: { $gt: 25 } } )

 

4、多条件查询

4.1、针对数组所有元素的复合条件查询

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )

查询dim_cm中,元素a满足大于15且元素b满足小于20,或某元素同时满足大于15小于20的文档

 

4.2、数组中单元素满足所有条件的查询

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

数组dim_cm中至少有一个元素满足大于22且小于30的文档:

 

4.3、根据数组下标查询

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )

查询dim_cm中下标为1元素大于25的文档

 

4.4、根据数组长度查询

db.inventory.find( { "tags": { $size: 3 } } )

查询tags数组长度为3的文档

 

 

里层(嵌入)文档的数组查询(数组元素是文档)

插入数据:

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 } ] }
]);

1、精确查询

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

查询instock 数组中匹配的文档,顺序一致:

 

2、文档数组指定字段的条件查询

db.inventory.find( { 'instock.qty': { $lte: 20 } } )
instock 文档数组中包含的qty小于等于20的文档:

 

3、加入对里层文档的下标限制

db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )

instock 文档数组的首元素的qty 小于等于20:

 

4、文档数组的多条件查询

4.1、里层的单份文档满足多个查询条件

db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )

instock 至少包含一份文档,该文档的qty=5且 warehouse =A

db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )

instock 至少包含一份文档,该文档的qty大于10且小于等于20:

 

4.2、复合字段名的查询

db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )

存在instock的qty大于10的文档,又存在instock的qty小于等于20的文档:

 

db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )

数组instock 中存在文档的qty=5,又存在文档的warehouse =A

 

指定查询返回的字段

插入数据:

db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

 

1、返回所有字段

db.inventory.find( { status: "A" } )

相当于sql:SELECT * from inventory WHERE status = "A" 

 

2、返回指定字段和_id字段

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

相当于sql:SELECT _id, item, status from inventory WHERE status = "A"

3、省略_id 字段

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )

相当于sql:SELECT item, status from inventory WHERE status = "A"

4、省略部分字段,其他字段都返回

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

 

 

5、指定里层文档返回的字段

db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)

里层文档的size只返回uom字段

 

6、省略里层文档的部分字段

db.inventory.find(
   { status: "A" },
   { "size.uom": 0 }
)

省略size的uom字段

 

7、里层文档返回指定下标元素

db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )

返回instock 最后一个元素

 

 

查询null或missing 字段

插入数据

db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])

1、匹配null查询

db.inventory.find( { item: null } )

返回item是null 或没有该字段的文档 

2、根据type查询null

db.inventory.find( { item : { $type: 10 } } )

bson类型10表示null

 

3、根据是否存在字段来查询

db.inventory.find( { item : { $exists: false } } )

 

 

转自:https://docs.mongodb.com/manual/tutorial/query-documents/

mongodb shell网页:mongodb web shell

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值