前面介绍的查询可以说是常见的典型case,但是mongodb中有两个比价特殊的数据类型,数组 + 对象,自然的也会有一些非典型的查询case,下面主要针对这两种数据类型的查询姿势,给出实例讲解
1. 数组
首先准备一些供数组操作的文档如下
1 | { "_id" : ObjectId("5e7b5ac10172dc950171c488"), "name" : "一灰灰blog", "age" : 19, "skill" : [ "java", "python", "sql" ], "tag" : 2 } |
长度查询
根据数组长度进行查询,借助$size
来统计数组长度
1 | # 查询数组长度为3的文档 |
长度范围查询
请注意,不支持长度的比较查询,如下,会报语法错误
1 | db.doc_demo.find({'skill:{$size: {$gt: 2}}}) |
要实现范围查询,可以借助$where
来实现($where
比较强大,后面单独说明)
1 | # 请注意判空需要有 |
数组内容查询
根据数组内容进行查询,常见的有两种方式,一个是直接根据数组定位比较如
1 | # 查询skill数组中,第一个元素为java的文档 |
上面这种实用性可能并不大,另外一个常见的case就是查询数组中包含某个元素的文档,这时可以借助$elemMatch
来实现
1 | # 查询skill数组中包含 java 元素的文档 |
说明,当数组的元素是Object类型时,还可以用右边这种姿势:db.doc_demo.find({'skill': {$elemMatch: {'subField': 'xxx'}}})
2. Object
因为mongodb支持内嵌文档,所以根据内嵌文档进行查询的场景也是不少的
首先准备三个用于后续查询测试的文档
1 | { "_id" : ObjectId("5e7c5a61f020f58f5323e52e"), "name" : "一灰灰", "doc" : { "title" : "简单的标题", "content" : "简单的内容", "tag" : [ "java", "后端" ] } } |
根据内嵌文档字段查询
查询姿势和field查询相似,只是需要注意一下key的语法为: field.subField
, 实例如下
1 | db.doc_demo.find({'doc.title': '22'}) |
存在性查询
查询嵌入文档包含某个field的case,和普通的查询姿势也一样
1 | db.doc_demo.find({'doc.visit': {$exists: true}}) |
排序
根据Object的成员进行排序,操作姿势也基本一样
1 | db.doc_demo.find({'doc': {$exists: true}}).sort({'doc.visit': -1}) |
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog