MongoDB常用的Query操作有哪些

60次阅读
没有评论

共计 7326 个字符,预计需要花费 19 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍 MongoDB 常用的 Query 操作有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

                                                            本篇文章给大家带来的内容是关于 MongoDB 的常用 Query 操作的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言:使用的可视化工具是 Studio 3T,官网 – https://studio3t.com/
版本号:MongoDB shell version v3.4.2
如何使用:https://blog.csdn.net/weixin_…
看点:重点看操作符那块。
如何查找:在此页面按 ctrl+F 输入关键字查找

一、常用 Query
为方便操作,在插入原数据前,先删除所有文档(在项目中请谨慎操作!):

db.getCollection(inventory).deleteMany({})

0、查看所有文档

db.getCollection(inventory).find({})

1、对象查找
1.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 }
]);

1.2、查找 size.h 等于 14,size.w 等于 21,size.uom 等于 cm 的文档

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

1.3、查找 size.uom 等于 in 的文档

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

注意:当查找单个对象属性时,务必加上引号!

1.4、查找并返回对象里的指定字段

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

1.5、查找并过滤对象里的指定字段

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

2、数组查找
2.1、原数据

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

2.2、查找 tags=[red , blank] 的文档

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

注意:不是包含关系,即 tags: [red , blank , plain] 是不包括在内的

2.3、查找 tags 包含 red 的文档

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

注意:不能这么写 db.inventory.find({ tags: [ red] } ),这样就表示查找 tags 是 red 的文档

3、数组中包含对象的查找
3.1、原数据

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

3.2、查找数组中有一个对象符合条件的(不是包含),只要数组中有一个对象符合条件就返回整个数组

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

要严格按照字段的顺序来,如果调换字段顺序会 找 不 到,如下:

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

3.3、查找数组中的元素对象,有一个元素对象的 qty=5,或者该对象(或者是其他元素对象)的 warehouse=A

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

3.4、查找数组中的对象,并返回对象的某个属性

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

4、普通查找
4.1、原数据

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

4.2、查询并返回指定字段
在 status=A 的条件下,返回 _id,item,status 字段

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

结果:

{_id : ObjectId( 5c91cd53e98d5972748780e1), 
 item : journal , 
 status : A }
// ----------------------------------------------
{_id : ObjectId( 5c91cd53e98d5972748780e2), 
 item : notebook , 
 status : A }
// ----------------------------------------------
{_id : ObjectId( 5c91cd53e98d5972748780e5), 
 item : postcard , 
 status : A }

4.3、由 4.2 可知,_id 是自动带着的,可以去掉,如下
查询不带(去掉) id:

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

注意:除了 id 可以在过滤掉的同时,还去保留其他字段外,其他字段不能在 0 的同时,还写 1
如:

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

会报错

MongoDB 常用的 Query 操作有哪些

4.4、排除特定字段,返回其他字段

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

5、查找 null 或不存在的 键
5.1、原数据

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

5.2、查找 item 为 null 的文档,或者不包含 item 的文档

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

二、操作符
1、$lt  less than 小于
1.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 }
]);

1.2、查找 size.h 小于 15 的文档集合

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

1.3、$lt 与 AND 联用
查找 size.h 小于 15,并且 size.uom 是 in,并且 status 是 D 的文档

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

2、$lte less than equal 小于等于
2.1、原数据

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

2.2、查找 instock.qty 小于等于 20 的文档,只要数组中有一个对象符合条件就返回整个数组

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

3、$gt greater than 大于
3.1、原数据

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

3.2、查找 dim_cm 大于 25 的文档

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

注意:只要包含大于 25 的元素的数组,都是符合条件的

3.3、查找 dim_cm 大于 15,或小于 20,或既大于 15,又小于 20 的文档

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

3.4、查找 dim_cm 既大于 22,又小于 30 的文档(是判断数组的某一个元素是否是大于 22,且小于 30 的,而不是判断数组的所有元素)

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

3.5、根据数组位置查找
查找 dim_cm 的第二个元素 大于 25 的文档

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

4、$size 根据数组长度查找
查找 tags 长度是 3 的文档

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

5、$gte 大于等于
5.1、原数据

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

5.2、查找数组的第一个元素(对象)的 qty 大于等于 20 的文档集合

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

6、$elemMatch 对象的属性匹配
6.1、在数组中查找符合 qty=5, warehouse= A 的对象,并返回该文档集合

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

6.2、在数组中查找符合 qty 大于 10 并且小于等于 20 的文档集合

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

如果不使用 $elemMatch 的话,就表示 qty 大于 10 或者小于等于 20,官方文档意思是,不在数组的某一个元素找 既满足条件 A 又满足条件 B 的 qty,而是在数组的所有元素上找,满足条件 A 或满足条件 B 的 qty

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

7、$slice 返回数组特定位置的元素
7.1、原数据

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

7.2、查找并返回 tags 数组的最后一个元素

db.inventory.find({ item: journal}, {item: 1, qty: 0, tags: { $slice: -1} } )

结果:

{_id : ObjectId( 5c91dce5e98d5972748780e6), 
 item : journal , 
 tags : [red}

8、$type 返回指定类型的元素
8.1、原数据

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

8.2、返回 null 类型的数据

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

类型如下:

MongoDB 常用的 Query 操作有哪些

详细文档请看:https://docs.mongodb.com/manu…

9、$exists 返回存在 / 不存在的键
查找不存在 item 键的数据

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

10、$all 包含
10.1、原数据

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

10.2、查找 tags 数组包含 [red , blank] 的文档

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

综上:
数组用的:$all、$size、$slice
对象用的:$elemMatch

以上是“MongoDB 常用的 Query 操作有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-18发表,共计7326字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)