mongodb数据库的常用操作语句
说在前面的话
本文所有的操作示例,都以集合“HistoryTaskBase”为例。
一、查询
1、时间区间
查询“通知时间”介于2019-09-01到2019-10-01之间的数据。
db.getCollection('HistoryTaskBase').find({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2019-10-01T00:00:00.000Z')}})
2、统计
db.getCollection('HistoryTaskBase').find({notifyTime:{$lte:ISODate('2023-11-10T00:00:00.000Z')}}).count()// 总记录数
39465

3、分页(skip和limit)
假设每页查询10条记录,分页查询第二页,语句见下:
- skip 跳过前面多少条记录
- limit 限制查询多少条记录
db.getCollection('HistoryTaskBase').find({notifyTime:{$lte:ISODate('2023-11-10T00:00:00.000Z')}}).skip(10).limit(10)

4、排序sort
- 降序-1
db.getCollection('HistoryTaskBase').find({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2023-12-01T00:00:00.000Z')}}).sort({notifyTime:-1})

- 升序1
db.getCollection('HistoryTaskBase').find({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2023-12-01T00:00:00.000Z')}}).sort({notifyTime:-1})

- 多重排序
先按schoolId升序,再是createdOn倒序
db.getCollection('xxx').find({}).sort({schoolId: 1, createdOn:-1});
5、in集合
totalIds 是一个数组类型,在查询包含关系的时候,使用In集合。
db.getCollection('xxx').find({"totalIds":{$in:[152290]}});

6、nin不存在集合
是in的相反操作,不存在于集合里。
7、比较操作
- $eq:等于
- $ne:不等于
- $lt:小于
- $lte:小于等于
- $gt:大于
- $gte:大于等于
db.getCollection('xxx').find({"classroomId":{$eq:"067JOE"}});db.getCollection('xxx').find({"classroomId":{$ne:"067JOE"}});
像前文说的时间区间查询,就是使用大于小于的比较操作实现。因为都比较简单,就不一一举例了。
8、存在性操作
检查字段是否存在
db.getCollection('xxx').find({"classroomId":{$exists: true}});
9、数组查询
- size-查询数组的长度等于1的记录
db.getCollection('xxx').find({"totalIds":{$size: 1}});

- elemMatch-匹配数组中的元素
要查询数组desktopList下的数组taskList的taskId=“2ASS229CMY”
数据结构示例:
{"_id":"5c6cfc303daedd4e40fe91f5","userId":150908,"classroomId":"ZN41B3","taskTotalNumber":5,"desktopList":[{"desktopId":"IQZ5SN2R","classId":0,"classMemNumber":0,"desktopType":0,"taskList":[{"taskId":"2ASS229CMY","taskType":1,"materialId":"ZQ9T1JCA2U"}]}]
}
mongodb查询语句写法见下:
db.getCollection('xxx').find({"desktopList": {"$elemMatch": {"taskList": {"$elemMatch": {"taskId": "2ASS229CMY"}}}}
});
10、逻辑查询
- $and
默认,多个条件的查询就是and了。
它的语法格式是:{ $and: [ { }, { }, … , { } ] }
示例:
查询userId=152408且schoolId=684的记录
db.getCollection('ClassroomBase').find({ $and: [ { "userId" : 152408 }, { "schoolId": 684 } ] } );// 等同于下面的语句
db.getCollection('ClassroomBase').find({ "userId" : 152408 , "schoolId": 684 } );
- $or
语法格式是:{ $or: [ { }, { }, … , { } ] }
示例见下:
查询userId=152408或schoolId=684的记录
db.getCollection('ClassroomBase').find({ $or: [ { "userId" : 152408 }, { "schoolId": 684 } ] } );
- $nor
语法格式是:{ $nor: [ { }, { }, … { } ] },它是or的取反。
继续上面的示例,就变成了要查询userId != 152408 且 schoolId != 684的记录
db.getCollection('ClassroomBase').find({ $nor: [ { "userId" : 152408 }, { "schoolId": 684 } ] } );
- $not
需要注意的是,它会查询出不包含该字段的文档。
语法各是:{ field: { $not: { } } },逻辑运算中,简单的取反。一般是针对单条件而言。
比如,查询语句见下:
db.getCollection('xxx').find({ schoolId: { $not: { $gt: 1000 } } });
它将查询出schoolId 不大于1000的记录,也会把schoolId为空的记录查询出来。
二、删除
1、deleteMany-批量删除
推荐使用这个,匹配到多少就删除多少条记录。
db.getCollection('HistoryTaskBase').deleteMany({notifyTime:{$gte:ISODate('2019-09-01T00:00:00.000Z'),$lte:ISODate('2019-10-01T00:00:00.000Z')}})// 返回
{"acknowledged" : true,"deletedCount" : 3693.0
}

2、deleteOne-删除单条记录
db.getCollection('xxx').deleteOne({"_id":"5c6cfc303daedd4e40fe91f4", "isDelete": true});// 返回
{"acknowledged" : true,"deletedCount" : 0.0
}
3、findOneAndDelete-删除并返回删除前的文档
与上一个操作语句不同,会返回删除前的文档。相同的是:都会删除该记录。
db.getCollection('xxx').findOneAndDelete({"classroomId":"ZN41B3"});

再次查询,则返回0条记录:

三、聚合操作
- $match: 过滤文档,只保留满足指定条件的文档
- $group: 对文档进行分组操作
示例一:聚合查询最近几天(2023-11-20到2023-11-23)创建的课堂,按天求和,算出每一天的总人数。
- createdOn 创建时间
- $dayOfYear 操作符从 createdOn 中提取出一年中的第几天,并以此为基准进行分组
- $addToSet 操作符用于将符合条件的 totalIds 字段的值添加到一个集合中。
这意味着对于每个分组(每天的文档),都会创建一个包含唯一 totalIds 值的集合。
db.getCollection('xxx').aggregate([{ $match : { createdOn:{$gte:ISODate('2023-11-20T00:00:00.000Z'),$lte:ISODate('2023-11-24T00:00:00.000Z')},isDelete:false } },{$group: {_id: { day: { $dayOfYear: "$createdOn" } },userIds : {$addToSet : "$totalIds"}}
}
])
返回值

示例二:聚合查询最近几天(2023-11-20到2023-11-23)创建的课堂数,按天分组。
db.getCollection('xxx').aggregate([{ $match : { createdOn:{$gte:ISODate('2023-11-20T00:00:00.000Z'),$lte:ISODate('2023-11-24T00:00:00.000Z')},isDelete:false } },{$group: {_id: { day: { $dayOfYear: "$createdOn" } },total: { $sum: 1 }}
}
])
// 聚合结果

其他聚合
除了$sum外,还有最大、最小和平均等常用的函数。
{$group: {_id: "$field",total: { $sum: 1 },average: { $avg: "$numericField" },max: { $max: "$numericField" },min: { $min: "$numericField" }}
}
$lookup
本示例是查询订单,然后外关联商品表,主外键是productId。
db.orders.aggregate([{$lookup: {from: "products",localField: "productId",foreignField: "_id",as: "product"}},{$unwind: "$product" // 展开 product 数组}
]);
- orders数据示例
{"_id": 1,"orderNumber": "NO123","productId": 101,"quantity": 2
}
- products数据示例
{"_id": 101,"productName": "商品名称","price": 1000
}
- 查询结果见下,通过$unwind,将匹配到的商品文档变为单独的文档。
{"_id": 1,"orderNumber": "NO123","productId": 101,"quantity": 2,"product": {"_id": 101,"productName": "商品名称","price": 1000}
}
四、函数
在 MongoDB 的 shell 环境中,你可以使用 JavaScript 来编写条件语句。这里只列举几个作为示例。
1、foreach
多个集合的嵌套循环查询
- 先查询ClassroomBase,得到其classroomId
- 再传递给Desktop,作为查询条件进行查询
- 遍历结果,对数组taskList的长度进行累加
// 查询各个课堂的人数和任务数
db.xxx.find({"isDelete": false}).forEach(function (doc) {// 任务数var taskSize = 0;// 嵌套查询db.Desktop.find({"classroomId": doc.classroomId}, {"desktopList": 1}).forEach(function(doc){doc.desktopList.forEach(function(task) {taskSize += task.taskList.length})});print("老师ID:" + doc.userId + " 课堂ID:" + doc.classroomId + " 人数:" + doc.totalIds.length + " 任务数: " + taskSize)
2、print
输出查询结果
3、push
查询2022-12-25这一天上课的课堂ID列表
var classroomIds = new Array();
db.xxx.find({startTime:{$gte:ISODate('2022-12-25T00:00:00.000Z'),$lte:ISODate('2022-12-26T00:00:00.000Z')},isDelete:false}).forEach(function (doc) {classroomIds.push(doc.classroomId);})// 输出课堂ID数组
print(classroomIds.length);
4、if
var x = 10;if (x > 5) {print("x 大于 5");
} else if (x === 5) {print("x 等于 5");
} else {print("x 小于 5");
}
5、switch
var day = "Monday";switch (day) {case "Monday":print("星期一");break;case "Tuesday":print("星期二");break;// 其他 case 语句default:print("其他天");
}
6、三目运算
var age = 20;
var message = (age >= 18) ? "成年人" : "未成年人";
print(message);
五、总结
mongodb还有一些运维,比如定期备份、集群管理等,有空再整理。
mongodb的修改操作,也未在本文涉及。
本文侧重于mongodb的查询,说实话,查询才是最复杂的。
希望可以帮助到你,有空我再更新~~
相关文章:
mongodb数据库的常用操作语句
说在前面的话 本文所有的操作示例,都以集合“HistoryTaskBase”为例。 一、查询 1、时间区间 查询“通知时间”介于2019-09-01到2019-10-01之间的数据。 db.getCollection(HistoryTaskBase).find({notifyTime:{$gte:ISODate(2019-09-01T00:00:00.000Z),$lte:ISOD…...
ubuntu安装完qt后发现找不到图标
layout: post # 使用的布局(不需要改) title: Qt启动问题 # 标题 subtitle: ubuntu安装完Qt #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: true # 是否归档 tags: …...
bazel远程构建(Remote Execution) -- Buildfarm部署中的问题
问题1:server报logOverdueOperation和WARNING: removed dispatched operation shard/operations/, worker报WARNING: missing queued operation: shard/operations/等问题,详情如下: Server Log INFO: DispatchedMonitor: Testin…...
论文阅读:MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model
论文标题: MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model 翻译: MedSegDiff:基于扩散概率模型的医学图像分割 名词解释: 高频分量(高频信号)对应着图像变化剧烈的部分&…...
openssl加解密-干货分享
0.需要包含的头文件和预定义常量 #include <openssl/rand.h>#include <fstream>#include <openssl/aes.h>#include <openssl/rand.h>// 加密密钥和初始化向量(IV)长度#define AES_KEY_LENGTH 32#define AES_IV_LENGTH 16 1.密…...
【考研数据结构代码题7】求一元多项式之和
题目:编写一个算法,求一元多项式之和 考纲:一元多项式的表示与相加 题型:代码填空或算法设计 难度:★★★ 参考代码 typedef struct node{float coef;//系数int exp;//次数struct node *next; }polynode; polynode *…...
python避坑指南(更新中)
os.path.join 避免连续的/,看示例即清楚,最好的避免方法是字符串首末都不要加’/: join用法 用join前面的符号将参数数组里面的字符串连接起来,注意join只有一个参数...
可以远程控制电脑桌面的软件有哪些?
随着电脑办公的普及,人们对于远程控制电脑的需求也越来越大。远程控制电脑技术能够让用户在不同地点的电脑之间进行操作和访问,能够提高工作效率。可以远程控制电脑桌面的软件有哪些? 1. 远程监控电脑软件 需要安装在被控制端电脑ÿ…...
洛谷 P1250 种树
种树 题目背景 一条街的一边有几座房子,因为环保原因居民想要在路边种些树。 题目描述 路边的地区被分割成块,并被编号成 1 , 2 , … , n 1, 2, \ldots,n 1,2,…,n。每个部分为一个单位尺寸大小并最多可种一棵树。 每个居民都想在门前种些树&#…...
java大视频在线预览(支持断点下载)
1.说明 大视频的在线预览,如果不支持断点下载,将无法在苹果手机上播放,同时不支持进度条拖动. 之所以这样,是因为视频文件太大了,通过二进制流向浏览器传输时,整个文件尚未传输完成时,会被浏览器强制关闭流,不再接收,等缓存播放到一定程度时,浏览器会再次向后端请求视频文件,同…...
OpenCV入门10——特征点检测与匹配
文章目录 特征检测的基本概念Harris角点检测Shi-Tomasi角点检测SIFT关键点检测SIFT计算描述子SURF特征检测OBR特征检测暴力特征匹配FLANN特征匹配实战flann特征匹配图像查找图像拼接基础知识图像拼接实战 特征点检测与匹配是计算机视觉中非常重要的内容。不是所有图像操作都是对…...
教育机构拒绝“数据陷阱”,群硕将英孚新一代教学管理系统搬上桌
为什么小机构年年担心招生不够,英孚却令学生家长趋之若鹜? 区别就在教学管理方式。为了更好地管理分布全球的校区、学生和老师,英孚应用了一套教学管理系统,帮助学校管理学员,帮老师智慧排课,帮助家长记录…...
小辰的智慧树(差分+前缀和)
登录—专业IT笔试面试备考平台_牛客网 1.考虑总长度之和不能超过m,2考虑限制每棵树高度不能低于ci,如果用二分最短输能截到的高度,还要另外去判断,是否每棵树mid都能严格大于ci ,这样容易超时,换个角度&…...
Windows如何使用key登录Linux服务器
场景:因为需要回收root管理员权限,禁止root用户远程登录,办公环境只允许普通用户远程登录,且不允许使用密码登录。 一、生成与配置ssh-key 1.使用root管理员权限登录到目标系统。 2.创建一个新的普通用户,和设置密码用…...
k8s无法删除pv,pvc问题
问题: 在k8s里面创建了pv,pvc删除时报错:error: resource(s) were provided, but no name was specified 解决: 正确的删除顺序:1.先删除pod2.再删除pv 3.在删除pvc 删除pv,pvc命令: kubect…...
基于框架的线性回归
线性回归是机器学习中最简单和最常用的回归方法之一。它建立了自变量和因变量之间的线性关系,并通过拟合一条直线或超平面来预测和分析数据。 基于框架的线性回归是构建线性回归模型的一种常见方法,它利用现有的机器学习框架来实现线性回归模型的建立、…...
万宾科技智能井盖传感器使用方式,具有什么效果?
有问题的井盖可能导致人们在行走或驾驶时不经意地踩中或碰到,从而导致摔倒、扭伤或交通事故等安全事故。有问题的井盖可能会破坏井盖和下方污水管道之间的密封性,导致污水泄漏。这不仅会对环境造成污染,还可能对公共卫生和健康构成威胁。 将智…...
13.什么是Spring beans?
什么是Spring beans? Spring 官方文档对 bean 的解释是: In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assem…...
算法通关村第十二关|白银|字符串经典基础面试题
1.反转问题 1.1 反转字符串 原题:力扣344. 要求原地修改。 public void reverseString(char[] s) {if (s null || s.length() 0) {return;}int n s.length;for (int left 0, right n - 1; left < right; left, right--) {char temp s[left];s[left] s…...
Spring框架学习 -- 读取和存储Bean对象
目录 🚀🚀 回顾 getBean()方法的使用 根据name来获取对象 再谈getBean() (1) 配置扫描路径 (2) 添加注解 ① spring注解简介 ② 对类注解的使用 ③ 注解Bean对象的命名问题 ④ 方法加Bean注解 (3) Bean 注解的重命名 (4) 获取Bean对象 -- …...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
