Mongdb查询 - 常见场景查询语句示例

2023-10-28

目录

查询数据

1、整个文档查询

2、条件查询

1. 精准等值查询

2. 多条件查询

3. 嵌套对象精准查询

4. 返回指定字段

5. 条件查询 and

6. 条件查询 or

7.范围查询 200<9000<>

8.范围查询 in

9.null查询

3、正则表达式查询

4、数组查询

5、嵌套文档查询

6、高级查询

分页查询



查询数据

1、整个文档查询

db.inventory.find({}) 查询所有的文档 :

db.inventory.find({}).pretty() 返回格式化后的文档:

2、条件查询(比较运算符)

1. 精准等值查询

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

db.inventory.find( { qty: 0 } );

2. 多条件查询

db.inventory.find( { qty: 0, status: "D" } );

3. 嵌套对象精准查询

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

4. 返回指定字段

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

默认会返回_id 字段, 同样可以通过指定 _id:0 ,不返回_id 字段

5. 条件查询 and

db.inventory.find({$and:[{"qty":0},{"status":"A"}]}).pretty();

上面两个查询的结果是一样的。

6. 条件查询 or

db.inventory.find({$or:[{"qty":0},{"status":"A"}]}).pretty();

7.条件范围查询 200<price<9000

//查询价格200-9000范围的数据
db.prodgory.find({"price":{$gt:"200",$lt:"9000"}})

8.条件范围查询 in

//给定范围查询
db.product1.find({"category":{$in:['手机','笔记本电脑','书籍']}})

9.条件查询 null与exists

null的查询稍微有点不同,假如我想查询z为null的数据,如下:

db.sang_collect.find({z:null})

这样不仅会查出z为null的文档,也会查出所有没有z字段的文档,如果只想查询z为null的字段,那就再多加一个条件,判断一下z这个字段存在不,如下:

db.sang_collect.find({z:{$in:[null],$exists:true}})

$exists字段匹配

$exists:匹配包含查询字段的文档

{ field : {$exists:  <boolean>} }

3、正则表达式查询

使用正则表达式查询我们在前面也已经介绍过了,这里的正则表达式语法和JavaScript中的正则表达式语法一致,比如查询所有key为x,value以hello开始的文档且不区分大小写:

db.sang_collec.find({x:/^(hello)(.[a-zA-Z0-9])+/i})

模糊查询

    一、某文档包含某字段的模糊查询:

    使用 sql 的写法
    select * from member where name like '%XXX%'

    在mongodb中(亲测有效):
    db.member.find({"name":{ $regex:"xxx"}})
    或者(不怎么好使)
    db.member.find({"name":{ $regex:/xxx/}})

    二、查询以某字段为开头的文档

    db.member.find({"name":{$regex:/^XXX/}})

    三、查询以某字段为结尾的文档

    db.member.find({"name":{$regex:/XXX$/}})

    四、查询忽略大小写

    db.member.find({"name":{$regex:/XXX/i}})


 

4、数组查询

假设我有一个数据集如下:

{
    "_id" : ObjectId("59f1ad41e26b36b25bc605ae"),
    "books" : [ 
        "三国演义", 
        "红楼梦", 
        "水浒传"
    ]
}

查询books中含有三国演义的文档,如下:

db.sang_collect.find({books:"三国演义"})

如果要查询既有三国演义又有红楼梦的文档,可以使用$all,如下:

db.sang_collect.find({books:{$all:["三国演义","红楼梦"]}})

当然我们也可以使用精确匹配,比如查询books为"三国演义","红楼梦", "水浒传"的数据,如下:

db.sang_collect.find({books:["三国演义","红楼梦", "水浒传"]})

不过这种就会一对一的精确匹配。

也可以按照下标匹配,比如我想查询数组中下标为2的项的为"水浒传"的文档,如下:

db.sang_collect.find({"books.2":"水浒传"})

也可以按照数组长度来查询,比如我想查询数组长度为3的文档:

db.sang_collect.find({books:{$size:3}})

如果想查询数组中的前两条数据,可以使用$slice,如下:

db.sang_collect.find({},{books:{$slice:2}})

注意这里要写在find的第二个参数的位置。2表示数组中前两个元素,-2表示从后往前数两个元素。也可以截取数组中间的元素,比如查询数组的第二个到第四个元素:

db.sang_collect.find({},{books:{$slice:[1,3]}})

数组中的与的问题也值得说一下,假设我有如下数据:

{
    "_id" : ObjectId("59f208bc7b00f982986c669c"),
    "x" : [ 
        5.0, 
        25.0
    ]
}

我想将数组中value取值在(10,20)之间的文档获取到,如下操作:

db.sang_collect.find({x:{$lt:20,$gt:10}})

此时上面这个文档虽然不满足条件却依然被查找出来了,因为5<20,而25>10,要解决这个问题,我们可以使用$elemMatch,如下:

db.sang_collect.find({x:{$elemMatch:{$lt:20,$gt:10}}})

$elemMatch要求MongoDB同时使用查询条件中的两个语句与一个数组元素进行比较。

5、嵌套文档查询

嵌套文档有两种查询方式,比如我的数据如下:

{
    "_id" : ObjectId("59f20c9b7b00f982986c669f"),
    "x" : 1.0,
    "y" : {
        "z" : 2.0,
        "k" : 3.0
    }
}

想要查询上面这个文档,我的查询语句如下:

db.sang_collect.find({y:{z:2,k:3}})

但是这种写法要求严格匹配,顺序都不能变,假如写成了db.sang_collect.find({y:{k:3,z:2}}),就匹配不到了,因此这种方法不够灵活,我们一般推荐的是下面这种写法:

db.sang_collect.find({"y.z":2,"y.k":3})

这种写法可以任意颠倒顺序。

6、高级查询

分页查询

mongo分页:使用skip()和limit();

                      当同时应用 sort, skip, limit 时 ,应用的顺序为 sort, skip, limit

命令:db.myCollection.find().sort({"_id":1}).skip(10).limit(10)

  • sort将数其根据_id排序,这步很重要
  • skip指跳过前10条记录,也可以说是从第10条开始
  • limit限制查询10条数据

结果为按_id升序排序后的第10-19条的数据。

Spring mongo实现:

 多个管道操作符执行示例

db.email_message.aggregate(
    [
        {"$match":{emailAcctId: "00990100402000022032801018411"}},
        {"$group":{
            _id:{uid:"$uid", emailAcctId:"$emailAcctId", messageId:"$messageId"}, 
            count:{$sum:1}}
        },
        {"$match":{count: {$gt:1}}}
    ]
   );

执行顺序:

  1. 匹配emailAcctId = 00990100402000022032801018411的文档;
  2. 以uid、emailAccId、messageId为组,查询出_id和count字段;
    1. 相当于MySQL语句:select uid,emailAccId,messageId,count(*) from email_message group by uid,emailAccId,messageId
  3. 对分组后的文档数据,匹配count > 1的文档;

更新数据

1、常见更新场景

  1.如何根据id进行更新

2.添加字段/修改字段值

 将tag 中有90 的文档,增加一个字段: flag: 1(如果文档中已经存在flag,则修改flag值为1):

db.userInfo.updateMany(
{tag:"90"},
{$set:{flag:1}}
);

3.修改字段名称

修改字段名称,把synonymsList表的name_status修改为status

db.getCollection('synonymsList').update({}, {$rename : {"name_status" : "status"}}, false, true)

把 from这个数组有hengduan这个值,并且zhLatin是空的数据的zhLatin字段删除

db.getCollection('species').update({"from":"hengduan","zhLatin":null},{$unset:{'zhLatin':''}},false, true)

语法介绍:

db.collection.update(criteria,objNew,upsert,multi)

参数说明:

criteria:查询条件

objNew:update对象和一些更新操作符

upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。

multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongdb查询 - 常见场景查询语句示例 的相关文章

  • 使用 RavenDB 的“传统”一对多查询

    我知道include RavenDB 的功能 它允许我在数据库的一次往返中立即获取引用的文档 但我的问题是 我首先获取的文档不包含对 其他 文档的引用 但 其他 文档引用了当前文档 想象一下我们在世界各地都有站点的设置 每个site可能会触
  • Google数据存储-在没有热点的情况下对创建日期字段进行索引

    我正在使用 Google Datastore 需要查询它来检索一些实体 这些实体需要按从最新到最旧的顺序排序 我的第一个想法是拥有一个包含时间戳的 date created 属性 然后我会索引该字段并对该字段进行排序 这种方法的问题是它会导
  • CouchDB 和 Couchbase 有什么区别?

    之间有什么本质区别吗CouchDB http couchdb apache org and 沙发底座 http www couchbase com 我认为CouchDB和Couchbase Server之间有一些本质的区别需要指出 我不会写
  • Cassandra cli:将十六进制值转换为人类可读的格式

    我开始于卡桑德拉 questions tagged cassandra 当我跑步时list or get命令在cassandra cli questions tagged cassandra cli 我得到这样的结果 default use
  • NoSQL:如何根据经纬度检索“房子”?

    我有一个用于存储房地产的 NoSQL 系统 我在每栋房子的键值存储中拥有的一条信息是longitude and latitude 如果我想检索地理纬度 经度框中的所有房屋 如下面的 SQL SELECT from houses WHERE
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • 使用 Django 会话存储登录用户

    我正在创建一个以 REST 为中心的应用程序 它将针对大多数特定于域的模型使用某种 NoSQL 数据存储 对于我打算围绕 REST 数据框架构建的主站点 我仍然希望对用户 计费信息和域数据模型范围之外的其他元数据使用传统的关系数据库 有人告
  • Cassandra 集群 - 特定节点 - 特定表高丢弃突变

    我在生产中的压缩策略是 LZ4 压缩 但我将其修改为 Deflate 对于压缩更改 我们必须使用 nodetool Upgradesstables 强制升级所有 sstable 上的压缩策略 但是 一旦在集群中的所有 5 个节点上完成了 U
  • 在 NoSQL 存储中存储图像

    我们的应用程序将通过 HTTP 提供大量缩略图大小的小图像 大小约为 6 12KB 我被要求调查使用 NoSQL 数据存储是否是一个可行的数据存储解决方案 理想情况下 我们希望我们的数据存储是容错且分布式的 在 NoSQL 存储中存储 bl
  • 计算 HBase 表中列族的记录数

    我正在寻找一个 HBase shell 命令来计算指定列族中的记录数 我知道我可以运行 echo scan table name hbase shell grep column family name wc l 然而 这将比标准计数命令运行
  • 如何:SQL 还是 NOSQL?

    我还没有遇到过这个问题 但这就是我的想法 非常肤浅和简单化恕我直言 如果您有键值类型的存储 并且所有访问都是键查找 请使用 NOSQL 解决方案 如果您想要基于值 和子值 进行查找或者有一些更复杂的东西 例如联接 您会选择关系解决方案 事务
  • Cassandra - 使用 ORDER BY 和 UPDATE 集群键的替代方法

    我的架构是 CREATE TABLE friends userId timeuuid friendId timeuuid status varchar ts timeuuid PRIMARY KEY userId friendId CREA
  • 通过updateTable创建多个GSI

    我在用着更新表 http docs aws amazon com AWSJavaScriptSDK latest AWS DynamoDB html updateTable property根据 DynmaoDB 的规定 根据文档 如果我们
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • Cassandra 与 ZooKeeper 的事务 - 这有效吗?

    我正在尝试在 ZooKeeper 的帮助下为 Cassandra 实现一个事务系统 由于我认为我在数据库实现方面没有足够的经验 所以我想知道我的想法原则上是否可行 或者是否有任何重大缺陷 以下是步骤的高级描述 识别所有要编辑的行 键 和列
  • 如何决定使用哪种NoSQL技术? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 MongoDB 基于文档 HBase 基于列 和 Neo4j 对象图 的优缺点是什么 我特别有兴趣了解
  • 为什么 NoSQL 比 RDBMS 更擅长“横向扩展”?

    我在a中读过以下文字技术博客 http tekedia com 12083 nosql database advantages and disadvantages 讨论NoSQL的优缺点 多年来 为了提高数据库服务器的性能 数据库管理员不得
  • 如何使用 pymongo 在 mongodb 中查询日期?

    我试图在 mongodb 中执行查询日期 但结果始终为空 我的查询如下 in the begin code def init self self now datetime now self db conexaoMongo self hora
  • Mongodump之后,调用MongoRestore挂起

    我们正在尝试在相对较小的数据库上做一个简单的 MongoDump 我们的步骤很简单 export 从目标机器上删除现有数据库 在目标机器上导入 MongoDump 完美执行 mongodump out root mongo prod DB

随机推荐

  • 虚拟服务器设置 要重启,虚拟服务器设置 要重启

    虚拟服务器设置 要重启 内容精选 换一换 如果在创建云耀云服务器时未设置密码 或密码丢失 过期 可以参见本节操作重置密码 运行中的云服务器重置密码需重启后新密码才能生效 请按照提示勾选 自动重启 密码丢失或过期前 已安装密码重置插件 公共镜
  • hutool工具包导出excel文件filename乱码与中文列宽自适应问题

    hutool工具包导出excel文件filename乱码与中文列宽自适应问题 话不多说 直接代码 修改之前 导出excel public static void downloadExcel List
  • 奥托零件价目表

    曲柄连杆机构 代码 名称 车型 状态 指导零售价 150000 活塞0 00 电喷 SC7080 配套 30 111210 活塞环 0 50 SC7080 配套 112 111260 连杆总成 SC7081 配套 51 136080 活塞3
  • Python实现字符串模糊匹配

    在一个字符串中 有时需对其中某些内容进行模糊匹配以实现条件的判定 如在 你好 hello world 中判断是否含有 llo Python中通过re search 方法实现 特别地 对于首位起始的内容匹配 也可通过re match 方法实现
  • spring配置文件中分别使用多个properties文件

    spring配置文件中分别使用多个properties文件 在使用spring时 有时候需要为了模块配置方便有时候需要针对不同的模块建立不同的applicationContext的配置文件 然后在对应模块的配置文件中对相应的模块进行单独配置
  • 通过Struts2文件下载时Can not find a java.io.InputStream with the name 异常

    异常堆栈信息 引用 严重 Can not find a java io InputStream with the name photoStream in the invocation stack Check the
  • openssh升级之后git账户免密登陆失效

    昨天升级了openssh之后 git操作是免密的却要输入密码了 但是输入正确密码却又一直提示密码错误 查看sshd服务状态发现使用git账户登陆的时候会提示 get shadow information for nouser 额 这是因为我
  • 解读奥哲·云枢:低代码拉动“企业数字化转型”进度条

    世界上有两种生意 一种是标准化 一种是个性化 20世纪初 美国亨利 福特提出了大规模生产方式 由于可以带来成本的大幅降低 大规模生产方式推动了汽车行业长达半个多世纪的发展 几乎被北美和欧洲的每一种工业活动所采纳 而其最显著的特征则是提供标准
  • VUE之jspreadsheet电子excel表格实时动态高度设置

    问题 excel电子表格在不同屏幕大小下横向滚动条会被遮挡 排查原因 由于excel高度固定导致 解决方法 设计页面较多 所以封装公共方法 步骤 1 使用混入封装动态设置excel高度方法 const mixinJexcel mounted
  • 【区块链】 区块链哈希算法

    哈希算法是什么 哈希算法是区块链中保证交易信息不被篡改的单向密码机制 哈希算法接收一段明文后 以一种不可逆的方式将其转化为一段长度较短 位数固定的散列数据 它有两个特点 加密过程不可逆 意味着我们无法通过输出的散列数据倒推原本的明文是什么
  • 数组的排序函数

    1 sort sort 函数对索引数组进行升序排序 改变原数组
  • 【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 数据库内核及生态开发 专栏简介 相当硬核 讲解数据库内核开发的理论 实战 带你深入解读数据库源码 剖析内核原理 实战手撸数据库内核 文章简介 一篇文章快速上
  • 对部署在docker上的gitlab,修改成员用户信息和重置密码

    1 先启动并进入docker上的gitlab docker exec ti gitlab bin bash 2 启动gitlab rails 这个启动过程会有点慢 加载完之后是这样 3 查找用户信息 先定位自己需要更改的账户的ID 可以先把
  • CMake 打包已经存在的动态库生成 target

    一 背景 在 CMakeLists txt 中 某模块 A 通过 add subdirectory 引入模块 B 模块 B 通过 add subdirectory 引入模块 C 模块 C 里面本身就是一个开源的动态库 比如 libtask
  • Geth在以太坊智能合约开发中最常用的工具(必备开发工具)

    命令用法 geth 选项 命令 命令选项 参数 版本 1 7 3 stable 命令 account 管理账户 attach 启动交互式JavaScript环境 连接到节点 bug 上报bug Issues console 启动交互式Jav
  • 多元回归预测

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 多元回归预测 Matlab多元线性回归MLR多变量预测模型 多变量输入结构 评价指标包括 MAE RMSE和R2等 代码质量极高 方便学习和替换数据 要求2018版本及以
  • Python 画多个子图函数 subplot

    子图函数 subplot 若要 pyplot 一次生成多个图形 一般要用到subplot函数 另外还有一个subplots函数 两个函数比较接近但略有区别 限于篇幅 我们只介绍 subplot函数 它的基本语法如下 ax plt subpl
  • 用户进程与内核进程通信netlink实例

    为了方便应用程序使用netlink接口 一个叫libnl库被开发 1 下载libnl2 http packages ubuntu com oneiric libnl2 2 下载libnl2 dev http packages ubuntu
  • 当前计算机什么专业好就业找工作,计算机哪个专业最好就业

    计算机专业是现在比较热门的专业 很多高考生在填报志愿时都很想填报计算机专业 但是由于不了解就有些犹豫 为了帮助大家提前做好打算 高三网小编特意为大家整理了一下计算机哪个专业最好就业 仅供学生们阅读 计算机哪个专业最好就业 计算机科学与技术专
  • Mongdb查询 - 常见场景查询语句示例

    目录 查询数据 1 整个文档查询 2 条件查询 1 精准等值查询 2 多条件查询 3 嵌套对象精准查询 4 返回指定字段 5 条件查询 and 6 条件查询 or 7 范围查询 200 lt 9000 lt gt 8 范围查询 in 9 n