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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

捷诚管理信息系统 SQL注入漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品介绍 捷诚管理信息系统是一款功能全面,可以支持自…

5 分钟,开发自己的 AI 文档助手!手把手教程

大家好,我是鱼皮。 几个月前,我自己开发过一个 AI 文档总结助手应用。给大家简单演示一下,首先我上传了一个文档,定义 1 1 等于 3: 然后把文档喂给 AI 文档总结助手,再向它提问,然后 AI 就回答…

私域流量该如何运营和布局?提供高质量的内容和服务

私域流量的运营和布局需要建立自己的品牌形象和口碑,提供高质量的内容和服务,利用裂变式营销扩大用户规模,数据化运营提高用户转化率和忠诚度,建立会员体系增加用户粘性和参与度,社群运营增加用户互动和粘性。同时需要…

美国服务器在大陆连不上怎么回事?

​  在租用任何美国服务器之前,都需要先搞清楚一些使用问题,毕竟服务器能够不间断地访问也是站在们所期望的。但有时,美国服务器网站或许也会突然出现在大陆打不开的情况,在面临这种情况时,我们应该怎么做? 查看连不…

创建文件夹的shell脚本

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 很简单,先判断文件夹是否存在,不存在则创建。具体如下: #!/bin/bash # 判断文件夹是否存在 if [ ! -d "$folder…

张弛声音变现课,青春剧配音实用攻略

在为青春剧添声时,配音艺术家须要捕获并传达剧中年轻角色的活泼精神、成长道路上的激情,以及他们在面对友情、爱情和理想时的情绪起伏。青春剧特别关注年轻人的成长故事,着重描绘他们在成长中的经历和变化。下面是一些为青春剧配音的建议&…

中期财报解读:内地业务增长失速,维他奶还能做回豆奶一哥吗?

维他奶虽然起源于中国香港,但却是不少内地人的儿时回忆。 这与维他奶的业务布局侧重点有关,中国内地一直是维他奶最重要的市场。11月21日,维他奶公布了截至2023年9月30日止6个月的2024财年中期业绩。财报显示,维他奶业务构成中&a…

Wpf 使用 Prism 实战开发Day06

首页设计二,创建ListBox列表数据 1.效果图: 一.首页鼠标悬停效果 使用触发器来实现 首先,上面的图标文本框是使用 Border 来实现的,那么就要在 Border 中重写该样式。 * 所有的控件,触发器固定写法应该都是这样,只…

性能测试你还不会做?看看这篇文章你就懂了!

性能测试的概述 性能:百度百科定义:器物的性质与效用。 生活中:买手机,买电脑,买车 –》 性能好:快(时间短)、资源 软件的性能:软件在允许的范围内使用过程中的反应的…

在国外怎么申请香港优才计划项目?和在内地申请有何区别?

在国外怎么申请香港优才计划项目?和在内地申请有何区别? 随着香港优才计划的热度持续上升,也吸引了不少优秀人才想要申请。如果你现在人在新加坡、加拿大、马来西亚、澳大利亚或者其他国家,想申请香港优才计划拿香港身份&#xff…

最新版灵沐V3.3微信资源类小程序源码支持流量主

源码简介 最新版灵沐V3.3微信资源类小程序源码支持流量主,一套不错的流量主变现资源下载小程序,它支持在微信、QQ和抖音平台上运行。这次更新主要集中在全局UI设计的升级,并依然注重资源下载和激励视频变现的功能。另外,还新增了…

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

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

淘宝返利APP草柴如何绑定淘宝账号?

草柴APP是一款淘宝、天猫、京东大额优惠券领取及购物返利省钱工具。通过草柴APP绑定淘宝账号,可领取淘宝大额内部隐藏优惠券,领取成功再购物可享券后价优惠,确认收货后可获得淘宝返利。 淘宝返利APP草柴如何绑定淘宝账号? 1、手…

知虾:揭秘Shopee大数据采集及分析平台的全方位运营利器

Shopee是如今备受瞩目的电商平台之一,而要在这个竞争激烈的市场中脱颖而出,了解市场趋势、选择畅销商品、分析竞争对手等是至关重要的。这就是为什么Shopee推出了知虾,一个强大的大数据采集及分析平台。本文将详细介绍知虾的功能和优势&#…

pip安装tkinter模块失败 No matching distribution found for tkinter

我想使用Python创建一个简单的桌面应用程序, 这个应用程序依赖于tkinter, 然而,当我尝试安装过程时,出现了错误。 $ pip install tkinter ERROR: Could not find a version that satisfies the requirement tkinter (from versions: none) ERROR: No matching distributio…

YOLOv8使用自己训练的模型,将检测图片进行可视化:效果超过YOLOv5模型,丰富改进模型的检测展示

💡更多改进内容📚 芒果专栏 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 YOLOv8使用自己训练的模型,将检测图片进行可视化:效果超过YOLOv5模型,丰富改进模型的检测展示 文章目录 核心代码改进新增代码部分修…

头发的方向图(2D和3D)与合成

首先,我们从一个不受光照限制的环境中拍摄一组输入图像,这些图像包含了头发的不同视角和姿态。我们对这些图像进行半自动的分割,将头发从背景中分离出来,然后使用PMVS ,一种先进的多视角立体算法,来重建一个…

环卫大姐张建娜:用实际行动诠释英语学习重要性

近日,一位身穿橘黄色工作服,手拿扫把服务于三里屯使馆区的环卫大姐张建娜,凭借一口流利的英语为外国人指路的视频在网上引起关注。不仅引发了大家对她“英语说的真好”的感叹,还有对如何学好英语的思考,以及引发了人们重新审视英语在日常生活中的重要性。 张建娜表示,其实英语…

玻色量子“揭秘”之可满足性问题(SAT)与QUBO建模

​ 摘要:布尔可满足性问题(Boolean Satisfiability Problem,简称SAT问题)是逻辑学和计算机科学中的一个问题,它的目的是确定是否存在一种解释,使给定的布尔公式成立。换句话说,它询问给定布尔公…

会议动态 | 祝贺2023 中国商品混凝土年会在上海隆重召开!

2023年11月19日-21日,由(国家)建筑材料工业技术情报研究所、中国散装水泥推广发展协会混凝土专委会主办的"笃信固本 行稳致远"——2023 第十九届全国商品混凝土可持续发展论坛暨2023中国商品混凝土年会在上海隆重召开! …