共计 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} )
会报错
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} } )
类型如下:
详细文档请看: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 网 – 提供最优质的资源集合!