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的查询,说实话,查询才是最复杂的。

希望可以帮助到你,有空我再更新~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的电影院安全系统的设计与实现(论文+源码)

1.系统设计 本次基于STM32F4的电影院安全系统的设计与实现,以STM32F4单片机为核心控制器,配合人体红外传感器,烟雾传感器,甲醛传感器等硬件设施,实现了对电影院内环境的检测,当出现异常则会通过蜂鸣器和LE…

实现了一个简易的计算器

计算器的界面如下: 实现过程: 通过html和css编写这样一个界面JavaScript实现功能 在通过JavaScript实现计算器功能的过程中,其实使用的都是一些基本指数。主要包括以下几点: If/else 分支.For 循环JavaScript 函数箭头函数&…

日志分析对决:揭示 ELK 与 GrayLog 的优势和差异

🎏:你只管努力,剩下的交给时间 🏠 :小破站 日志分析对决:揭示 ELK 与 GrayLog 的优势和差异 前言第一:ELK Stack简介第二:GrayLog简介架构:主要特性: 第三&am…

腾讯待办关停,怎么在手机上记录待办清单并设置提醒?

如果你之前一直在腾讯待办这款微信小程序中记录待办事项,那么你就会发现小程序中弹窗的“业务关停通知”弹窗,查看其中的内容可知,由于业务方向调整,腾讯待办将于2023年12月20日全面停止运营并下架,这就意味着我们无法…

面试:MyBatis问题

文章目录 什么是MyBatis?MyBatis的核心组件有哪些?能说说MyBatis的工作原理吗?MyBatis的工作流程是怎样的?Mybaits 的优点 & 缺点MyBatis 与 JPA 有哪些不同?MyBatis一二级缓存的区别?MyBatis如何处理延迟加载&am…

【一文搞定】在Docker中搭建centos7远程桌面环境(Xfce、Gnome两种方式)

目录 前言一、基于GNOME构建远程桌面二、基于Xfce构建远程桌面(轻量级) 前言 本文提供两种安装方式,均自己测试过,最后还是选择了Xfce,因为它比较轻量级,占用资源较少。大家也可以都试试,比较感…

外地人可以在上海当老师吗

随着社会的发展,越来越多的人涌入大城市,其中也包括上海。在这个繁华的城市里,许多人都梦想成为一名老师,但是外地人可以在上海当老师吗? 首先需要了解上海的教育政策。根据相关规定,外地人可以在上海当老师…

角色管理--产品角色负责人

研发组织管理--角色管理--产品角色负责人 定位 作为管理者,建设,管理,优化一个可控可自驱的产品经理团队,并保持对应业务领域的产品竞争力,在保证业界平均水平的基础上,不断尝试创新,争做行业…

C#实现图片背景色透明(亲测有效)

重要代码: Bitmap bm new Bitmap(origin); bm.MakeTransparent(); string Name_ "C:\\Users\\xx\\Downloads\\download\\" DateTime.Now.Ticks.ToString() ".ico";Size size new Size(256, 64);ConvertImageToIcon("C:…

视频网关简介

在数字化时代,视频通信已经成为了人们日常生活和工作中的重要部分。为了满足不同设备和平台之间的视频通信需求,各种视频协议应运而生。然而,这些协议之间的差异使得相互通信变得复杂。因此,视频网关作为一种重要的网络设备&#…

Oracle中文显示???????解决办法

项目场景: Oracleoracle中文显示???解决办法 问题描述 原因分析: Oracle中文显示???通常是由于字符集不匹配或者编码问题导致的。当数据库中的数据使用的是某种字符集,而客户端或者应用程序使用的是另一种字符集时,就会出…

解决Android端libc++_shared.so库冲突问题

前言 随着App功能增多,集成的so库也会增多,如果系统中多个so库都使用系统自动生成的libc_shared.so库,如果多个SDK都有该so包,就会出现报错: 解决办法 如果出现该问题,说明您的项目中有多个SDK共同依赖了C标…

fastjson2解析多为小数报错 TODO问题

解决方式:使用谷歌的gson可以解析多为小数

Java常见的bug

Java是一种强类型、面向对象的编程语言,有一些常见的bug或错误类型,尽管具体的bug会因项目和代码的不同而有所差异。以下是一些Java开发中常见的bug类型: 空指针异常(NullPointerException): 尝试在一个空对象上调用方法或访问属性时会引发空指针异常。这通常发生在没有对…

【双指针】有效三角形的个数

有效三角形的个数 611. 有效三角形的个数 - 力扣(LeetCode) 题目描述 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2…

MIME 类型

MIME 类型 MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。 MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 浏览器通常使用 MIME 类型(而不是文件扩展名&am…

如何编写一份优质的测试用例?

前言 这篇文章主要是想要写给测试小伙伴们的,因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手,我就想和大家简单的聊聊,分享一下我的一些见解和经验。 用例的五个构成元素: 用例标题前置条件测试步骤期望结果后置条…

05 Powershell发送http请求

一:发送http请求 1、语法: Invoke-WebRequest -uri "请求地址" -UseBasicParsing 2、实例: $result Invoke-WebRequest -uri "http://rdc.mingyuanyun.com/rdc-service/api/v2/apps/$($app)/versions/maxpackversion"…

腾讯又出王炸产品!使用混元大模型进行数据报表测试

最近腾讯出了自己的大模型,命名混元。 现在已经开始内测,感谢腾讯小伙伴卢晓明同学帮我们提前申请到了内测机会,接下来我们用腾讯混元大模型与实际工作结合,开始我的报表测试之旅。 腾讯混元大模型官方入口:https://hunyuan.ten…

Java 基础面试题大概有哪些?

Java基础面试题的范围非常广泛,一般包括以下几个方面: 一、Java基础语法 数据类型:Java中包括基本数据类型和引用数据类型,基本数据类型包括byte、short、int、long、float、double、char、boolean,引用数据类型包括…