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查询 - 常见场景查询语句示例 的相关文章

  • MongoDB 脚本基础知识 - 如何

    MongoDB 脚本的基础知识是什么 我认为剧本将以 js 我们使用它来运行它mongo try js 但如果我把 print db foo find in try js并使用mongo try js 它会说 MongoDB shell v
  • Firestore 查询 - 一对多关系

    我将开发 Android 移动应用程序并使用 Firebase 作为后端 我是 NoSql Firestore 的新手 在我的应用程序中 用户有很多主题 一个主题有很多帖子 帖子有很多评论和一张图片 用户也有很多追随者 在这种情况下 我如何
  • MongoDB:无法从 BSON 类型 EOO 转换为 Date

    我尝试使用聚合框架 带有 ruby 并像这样投影日期 db requests aggregate project gt id 0 method method user user year year gt timestamp 该文件是这样的
  • mongodb count 与 find with count [重复]

    这个问题在这里已经有答案了 我正在对 mongo 版本 2 4 和 3 2 集合中的文档进行计数 馆藏非常大 有3821085篇文档 我需要统计所有文件并附上参考资料 id 我尝试了两种不同的查询 db SampleCollection f
  • 如何在 Elasticsearch 中或在 Lucene 级别进行联接

    在 Elasticsearch 中执行相当于 SQL 连接的最佳方法是什么 我有一个包含两个大表的 SQL 设置 Persons 和 Items 一个人可以拥有many项目 人员和项目行都可以更改 即更新 我必须运行根据人和物品的各个方面进
  • 在数据库中存储 JS 数组和对象

    我有一个应用程序 可以让用户用 JS 构建东西 我希望用户能够保存其工作的当前状态以重用或共享它 但他拥有的是存储在 JS 数组中的 JS 对象的集合 具有非常不同的属性 颜色 标签 x y 位置 大小等 SQL 对于该特定任务来说似乎很糟
  • OrientDB地理定位

    我正在使用 OrientDB for NoSQL 数据库 但我不知道如何准确查询地理位置 我已阅读具体文档 东方数据库函数 https github com orientechnologies orientdb wiki SQL Where
  • 如何删除 MongoDB 中的所有数据库?

    I have a list of databases in my MongoDB How to delete all databases except local admin and config 您可以使用getDBNames 方法中的m
  • 获取列位置

    在 Cassandra DB 中 使用有序列族 我知道你能得到切片 但你能得到位置吗 例如 在此数据模型中 我保存如下分数 Scores 1000 bob lucas 900 tim 800 mario 知道用户的分数为 900 并且他的昵
  • 如何快速获取MongoDB pymongo的所有文档

    目前我通过在 pymongo 中迭代游标来获取文档 例如 for d in db docs find mylist append d 作为参考 对同一组数据 700 万条记录 执行 fetchall 大约需要 20 秒 而上述方法需要几分钟
  • 使用 cassandra-cli 创建两个复合列

    我的列族需要两个复合列 关键数据类型是BytesType 以下是使用 CQL 的表定义 CREATE TABLE stats gid blob period int tid blob sum int uniques blob PRIMARY
  • 是否可以针对 noSQL DB 构建复杂的查询

    我一直在研究 noSQL DB 但未能为自己满意地回答这个问题 是否可以针对 noSQL DB 构建复杂的查询 我想知道的查询类型是这样的 select from DB where vara gt x AND varb 2 AND varc
  • 一起使用 MongoDB 和 Neo4j

    我正在开始一个新项目 我正在考虑使用 MongoDB 作为文档存储工具 使用 Neo4j 作为映射文档之间关系的机制 然后我想通过 REST API 公开查询结果 人们会说这样做的优点和缺点是什么 是否有更好的方法可以使用不同的 NoSQL
  • 在 MVC 框架中将 noSQL 和 ORM 结合起来用于实际案例应用程序

    一段时间以来 我一直在尝试将过去几年中读到的一些有关 noSQL couchDB mongoDB Redis 的 酷 东西投入实际使用 我非常习惯使用 Django 编写应用程序 并开始使用 Play 当 Java 是唯一可接受的部署选项
  • Mongoose:find() 忽略重复值

    我有一只 聊天 猫鼬Schema它具有以下属性 const schema mongoose Schema recipient type mongoose Types ObjectId required true ref User sende
  • Firebase 数据库 - 编码错误

    我是 Firebase 的新手 我想使用他们的数据库 但编码似乎存在一些问题 这是我使用 UTF 8 编码的示例 json Stack This is madness Overflow 666 这就是当我将 json 导入 Firebase
  • 在 NoSQL 存储中存储图像

    我们的应用程序将通过 HTTP 提供大量缩略图大小的小图像 大小约为 6 12KB 我被要求调查使用 NoSQL 数据存储是否是一个可行的数据存储解决方案 理想情况下 我们希望我们的数据存储是容错且分布式的 在 NoSQL 存储中存储 bl
  • 设计 Cassandra 数据模型的最佳实践是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 以及需要避免哪些陷阱 您有任何交易中断吗 例如 我听说导出 导入 Cassandra 数据非常困难 这让我想知道这是否会妨碍将生产数据
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • MongoDB中批量FindAndModify的解决方案

    我的用例如下 我在 mongoDB 中有一组文档 我必须发送这些文档进行分析 文件格式如下 id ObjectId 517e769164702dacea7c40d8 日期 1359911127494 状态 可用 其他字段 我有一个阅读器进程

随机推荐

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

    虚拟服务器设置 要重启 内容精选 换一换 如果在创建云耀云服务器时未设置密码 或密码丢失 过期 可以参见本节操作重置密码 运行中的云服务器重置密码需重启后新密码才能生效 请按照提示勾选 自动重启 密码丢失或过期前 已安装密码重置插件 公共镜
  • 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