一灰灰blog 一灰灰blog
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 高可用
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)

一灰灰blog

资深搬运工
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 高可用
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)
  • InfluxDB

  • MongoDB

    • MongoDB之Collection导入导出
    • MongoDb系列教程零:环境安装与初始化
    • MongoDb系列教程一:基本概念
    • MongoDb系列教程二:连接
    • MongoDb系列教程三:基本工具介绍
    • MongoDb系列教程四:数据库 Database
    • MongoDb系列教程五:集合 Collection
    • MongoDb系列教程六:文档 Document 插入姿势
    • MongoDb系列教程七:文档 Document 删除姿势
    • MongoDb系列教程八:文档 Document 更新姿势
    • MongoDb系列教程九:文档 Document 查询基础篇
    • MongoDb系列教程十:文档 Document 查询高级篇
    • MongoDb系列教程十一:文档 Document 查询非典型篇
      • II. 其他
        • 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
        • 2. 声明
        • 3. 扫描关注
    • MongoDB系列教程十二:文档更新删除之非典型篇
    • MongoDb系列教程十三:索引
  • MySql

  • 数据库
  • MongoDB
一灰灰Blog
2020-04-08

MongoDb系列教程十一:文档 Document 查询非典型篇

前面介绍的查询可以说是常见的典型case,但是mongodb中有两个比价特殊的数据类型,数组 + 对象,自然的也会有一些非典型的查询case,下面主要针对这两种数据类型的查询姿势,给出实例讲解

# 1. 数组

首先准备一些供数组操作的文档如下

{ "_id" : ObjectId("5e7b5ac10172dc950171c488"), "name" : "一灰灰blog", "age" : 19, "skill" : [ "java", "python", "sql" ], "tag" : 2 }
{ "_id" : ObjectId("5e7b5ac40172dc950171c489"), "name" : "一灰灰blog", "age" : 20, "skill" : [ "web", "shell", "js" ], "tag" : 1 }
{ "_id" : ObjectId("5e7b5bb085a742842d2e23fc"), "name" : "一灰灰", "age" : 18, "sex" : "man", "tag" : 2 }
{ "_id" : ObjectId("5e7b5c2e0172dc950171c48a"), "name" : "一灰灰", "age" : 18, "hobby" : [ "play game" ] }
{ "_id" : ObjectId("5e7c5627f020f58f5323e52d"), "name" : "一灰灰2", "age" : 22, "skill" : [ "android", "ios" ] }
1
2
3
4
5

长度查询

根据数组长度进行查询,借助$size来统计数组长度

# 查询数组长度为3的文档
db.doc_demo.find({'skill': {$size: 3}})
1
2

长度范围查询

请注意,不支持长度的比较查询,如下,会报语法错误

db.doc_demo.find({'skill:{$size: {$gt: 2}}})
1

要实现范围查询,可以借助$where来实现($where比较强大,后面单独说明)

# 请注意判空需要有
db.doc_demo.find({$where:'this.skill !=null && this.skill.length>2'})
1
2

数组内容查询

根据数组内容进行查询,常见的有两种方式,一个是直接根据数组定位比较如

# 查询skill数组中,第一个元素为java的文档
db.doc_demo.find({'skill.0': 'java'})
1
2

上面这种实用性可能并不大,另外一个常见的case就是查询数组中包含某个元素的文档,这时可以借助$elemMatch来实现

# 查询skill数组中包含 java 元素的文档
db.doc_demo.find({'skill': {$elemMatch: {$eq: 'java'}}})
1
2

说明,当数组的元素是Object类型时,还可以用右边这种姿势:db.doc_demo.find({'skill': {$elemMatch: {'subField': 'xxx'}}})

# 2. Object

因为mongodb支持内嵌文档,所以根据内嵌文档进行查询的场景也是不少的

首先准备三个用于后续查询测试的文档

{ "_id" : ObjectId("5e7c5a61f020f58f5323e52e"), "name" : "一灰灰", "doc" : { "title" : "简单的标题", "content" : "简单的内容", "tag" : [ "java", "后端" ] } }
{ "_id" : ObjectId("5e7c5a8af020f58f5323e52f"), "name" : "一灰灰", "doc" : { "title" : "哈哈", "content" : "嘻嘻哈哈", "tag" : [ "随笔" ], "draft" : true } }
{ "_id" : ObjectId("5e7c5ae7f020f58f5323e530"), "name" : "一灰灰", "doc" : { "title" : "22", "content" : "3333", "tag" : [ "随笔" ], "draft" : false, "visit" : 10 } }
1
2
3

根据内嵌文档字段查询

查询姿势和field查询相似,只是需要注意一下key的语法为: field.subField, 实例如下

db.doc_demo.find({'doc.title': '22'})
1

存在性查询

查询嵌入文档包含某个field的case,和普通的查询姿势也一样

db.doc_demo.find({'doc.visit': {$exists: true}})
1

排序

根据Object的成员进行排序,操作姿势也基本一样

db.doc_demo.find({'doc': {$exists: true}}).sort({'doc.visit': -1})
1

# II. 其他

# 1. 一灰灰Blog (opens new window): https://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

# 2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog (opens new window)
  • QQ: 一灰灰/3302797840

# 3. 扫描关注

一灰灰blog

QrCode

编辑 (opens new window)
#MongoDB
上次更新: 2021/10/15, 19:56:22
MongoDb系列教程十:文档 Document 查询高级篇
MongoDB系列教程十二:文档更新删除之非典型篇

← MongoDb系列教程十:文档 Document 查询高级篇 MongoDB系列教程十二:文档更新删除之非典型篇→

最近更新
01
【基础系列】基于maven多环境配置
04-25
02
【WEB系列】内嵌Tomcat配置Accesslog日志文件生成位置源码探索
04-24
03
【搜索系列】ES查询常用实例演示
04-18
更多文章>
Theme by Vdoing | Copyright © 2017-2022 一灰灰Blog
MIT License | 鄂ICP备18017282号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×