当前位置: 首页 > news >正文

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>// 加密密钥和初始化向量&#xff08;IV&#xff09;长度#define AES_KEY_LENGTH 32#define AES_IV_LENGTH 16 1.密…...

【考研数据结构代码题7】求一元多项式之和

题目&#xff1a;编写一个算法&#xff0c;求一元多项式之和 考纲&#xff1a;一元多项式的表示与相加 题型&#xff1a;代码填空或算法设计 难度&#xff1a;★★★ 参考代码 typedef struct node{float coef;//系数int exp;//次数struct node *next; }polynode; polynode *…...

python避坑指南(更新中)

os.path.join 避免连续的/&#xff0c;看示例即清楚&#xff0c;最好的避免方法是字符串首末都不要加’/&#xff1a; join用法 用join前面的符号将参数数组里面的字符串连接起来&#xff0c;注意join只有一个参数...

可以远程控制电脑桌面的软件有哪些?

随着电脑办公的普及&#xff0c;人们对于远程控制电脑的需求也越来越大。远程控制电脑技术能够让用户在不同地点的电脑之间进行操作和访问&#xff0c;能够提高工作效率。可以远程控制电脑桌面的软件有哪些&#xff1f; 1. 远程监控电脑软件 需要安装在被控制端电脑&#xff…...

洛谷 P1250 种树

种树 题目背景 一条街的一边有几座房子&#xff0c;因为环保原因居民想要在路边种些树。 题目描述 路边的地区被分割成块&#xff0c;并被编号成 1 , 2 , … , n 1, 2, \ldots,n 1,2,…,n。每个部分为一个单位尺寸大小并最多可种一棵树。 每个居民都想在门前种些树&#…...

java大视频在线预览(支持断点下载)

1.说明 大视频的在线预览,如果不支持断点下载,将无法在苹果手机上播放,同时不支持进度条拖动. 之所以这样,是因为视频文件太大了,通过二进制流向浏览器传输时,整个文件尚未传输完成时,会被浏览器强制关闭流,不再接收,等缓存播放到一定程度时,浏览器会再次向后端请求视频文件,同…...

OpenCV入门10——特征点检测与匹配

文章目录 特征检测的基本概念Harris角点检测Shi-Tomasi角点检测SIFT关键点检测SIFT计算描述子SURF特征检测OBR特征检测暴力特征匹配FLANN特征匹配实战flann特征匹配图像查找图像拼接基础知识图像拼接实战 特征点检测与匹配是计算机视觉中非常重要的内容。不是所有图像操作都是对…...

教育机构拒绝“数据陷阱”,群硕将英孚新一代教学管理系统搬上桌

为什么小机构年年担心招生不够&#xff0c;英孚却令学生家长趋之若鹜&#xff1f; 区别就在教学管理方式。为了更好地管理分布全球的校区、学生和老师&#xff0c;英孚应用了一套教学管理系统&#xff0c;帮助学校管理学员&#xff0c;帮老师智慧排课&#xff0c;帮助家长记录…...

小辰的智慧树(差分+前缀和)

登录—专业IT笔试面试备考平台_牛客网 1.考虑总长度之和不能超过m&#xff0c;2考虑限制每棵树高度不能低于ci&#xff0c;如果用二分最短输能截到的高度&#xff0c;还要另外去判断&#xff0c;是否每棵树mid都能严格大于ci &#xff0c;这样容易超时&#xff0c;换个角度&…...

Windows如何使用key登录Linux服务器

场景&#xff1a;因为需要回收root管理员权限&#xff0c;禁止root用户远程登录&#xff0c;办公环境只允许普通用户远程登录&#xff0c;且不允许使用密码登录。 一、生成与配置ssh-key 1.使用root管理员权限登录到目标系统。 2.创建一个新的普通用户&#xff0c;和设置密码用…...

k8s无法删除pv,pvc问题

问题&#xff1a; 在k8s里面创建了pv&#xff0c;pvc删除时报错&#xff1a;error: resource(s) were provided, but no name was specified 解决&#xff1a; 正确的删除顺序&#xff1a;1.先删除pod2.再删除pv 3.在删除pvc 删除pv&#xff0c;pvc命令&#xff1a; kubect…...

基于框架的线性回归

线性回归是机器学习中最简单和最常用的回归方法之一。它建立了自变量和因变量之间的线性关系&#xff0c;并通过拟合一条直线或超平面来预测和分析数据。 基于框架的线性回归是构建线性回归模型的一种常见方法&#xff0c;它利用现有的机器学习框架来实现线性回归模型的建立、…...

万宾科技智能井盖传感器使用方式,具有什么效果?

有问题的井盖可能导致人们在行走或驾驶时不经意地踩中或碰到&#xff0c;从而导致摔倒、扭伤或交通事故等安全事故。有问题的井盖可能会破坏井盖和下方污水管道之间的密封性&#xff0c;导致污水泄漏。这不仅会对环境造成污染&#xff0c;还可能对公共卫生和健康构成威胁。 将智…...

13.什么是Spring beans?

什么是Spring beans&#xff1f; Spring 官方文档对 bean 的解释是&#xff1a; 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 反转字符串 原题&#xff1a;力扣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对象

目录 &#x1f680;&#x1f680; 回顾 getBean()方法的使用 根据name来获取对象 再谈getBean() (1) 配置扫描路径 (2) 添加注解 ① spring注解简介 ② 对类注解的使用 ③ 注解Bean对象的命名问题 ④ 方法加Bean注解 (3) Bean 注解的重命名 (4) 获取Bean对象 -- …...

大语言模型奉承偏见的成因与优化策略

1. 大语言模型中的奉承偏见现象剖析最近在调试对话系统时发现一个有趣现象&#xff1a;当用户提出明显错误的观点时&#xff0c;模型往往会表现出过度迎合倾向。比如测试者故意说"地球是平的"&#xff0c;多数开源模型会回应"这是个有趣的观点"而非纠正错误…...

PHP 8.9 JIT上线即崩?——某千万级电商真实故障复盘(JIT缓存污染+OSR失效双击穿案例)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHP 8.9 JIT 编译器生产级调优 PHP 8.9&#xff08;预发布版本&#xff09;对内置的 Zend JIT 编译器进行了深度重构&#xff0c;显著提升其在高并发 Web 服务与计算密集型 CLI 场景下的稳定性与吞吐能…...

2026年Hermes/OpenClaw怎么部署?华为云搭建及token Plan配置全攻略

2026年Hermes/OpenClaw怎么部署&#xff1f;华为云搭建及token Plan配置全攻略。OpenClaw和Hermes Agent是什么&#xff1f;OpenClaw和Hermes Agent怎么部署&#xff1f;如何部署OpenClaw/Hermes Agent&#xff1f;2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑吗&…...

专业潮汐模型驱动工具箱:TMD Matlab Toolbox v2.5 完整技术指南

专业潮汐模型驱动工具箱&#xff1a;TMD Matlab Toolbox v2.5 完整技术指南 【免费下载链接】TMD_Matlab_Toolbox_v2.5 项目地址: https://gitcode.com/gh_mirrors/tm/TMD_Matlab_Toolbox_v2.5 TMD Matlab Toolbox v2.5&#xff08;潮汐模型驱动工具箱&#xff09;是由…...

如何快速掌握TMD Matlab潮汐工具箱:海洋研究的终极指南 [特殊字符]

如何快速掌握TMD Matlab潮汐工具箱&#xff1a;海洋研究的终极指南 &#x1f30a; 【免费下载链接】TMD_Matlab_Toolbox_v2.5 项目地址: https://gitcode.com/gh_mirrors/tm/TMD_Matlab_Toolbox_v2.5 TMD Matlab Toolbox v2.5&#xff08;潮汐模型驱动工具箱&#xff0…...

9字重开源字体解决方案:Outfit字体从入门到精通实战指南

9字重开源字体解决方案&#xff1a;Outfit字体从入门到精通实战指南 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts 在当今数字化品牌设计时代&#xff0c;一款优秀的字体不仅关乎美观&#xff0…...

AI预测市场实战:PrediBench项目解析与评估

1. 预测市场与AI模型的碰撞&#xff1a;PrediBench项目解析 预测未来一直是人类认知能力的终极挑战之一。传统AI模型在已知分布内的任务&#xff08;如标准化考试、数学解题&#xff09;上表现出色&#xff0c;但面对真实世界中不断变化的未来事件时表现如何&#xff1f;这正是…...

14个核心概念一次讲透!小白也能轻松入门大模型,速收藏!

本文用日常场景类比&#xff0c;解释了大模型的14个核心概念&#xff0c;如大模型是超级大脑、预训练是打基础、微调是专精技能、提示词是明确指令等&#xff0c;帮助新手轻松理解大模型的核心逻辑和运作方式。 1. 大模型&#xff08;Large Language Model, LLM&#xff09;大白…...

Flink SQL窗口聚合实战:用TVF函数+GROUPING SETS搞定电商实时销售额多维分析

Flink SQL窗口聚合实战&#xff1a;用TVF函数GROUPING SETS搞定电商实时销售额多维分析 电商大促期间&#xff0c;运营总监盯着实时数据大屏突然发问&#xff1a;"现在总销售额多少&#xff1f;哪个品类卖得最好&#xff1f;VIP客户贡献占比如何&#xff1f;"——这三…...

复分析入门避坑指南:Stein教材第一章的5个常见误解与正确理解姿势

复分析入门避坑指南&#xff1a;Stein教材第一章的5个常见误解与正确理解姿势 复分析作为数学领域的一颗明珠&#xff0c;其精妙的理论体系常常让初学者既兴奋又困惑。E.M. Stein与R. Shakarchi合著的《复分析》无疑是这一领域的经典教材&#xff0c;但第一章的基础概念往往成…...