首页 > 数据库 >MongoDB常用脚本汇总

MongoDB常用脚本汇总

时间:2023-10-25 11:06:13浏览次数:48  
标签:脚本 getSiblingDB MongoDB db getCollection 查询 汇总 countDocuments id


概述

本文汇总记录日常工作中常用的MongoDB查询脚本。

实战

新增

新增集合:

db.getSiblingDB("corpus").createCollection('message');

删除

删除一条数据:

db.getSiblingDB("cx_user").userAccount.deleteOne({_id: ObjectId('628720aa454b9b0008ca218f')});

批量删除多条数据:

db.getSiblingDB("cx_user").userAccount.deleteMany({_id: {$in: [ObjectId('645af98020506e0008f61268'), ObjectId('6467100e3743bf00088c18c9')]}})

删除集合:

db.getSiblingDB("cx_user").getCollection("msg").drop();

更新

通过$set唯一更新未指定的新数据:

db.getSiblingDB("corpus").getCollection("risk_control").updateOne({_id: new ObjectId("6502be1b36b36e0008e7888e")}, {"$set": {mobile: "189*****725"}})

$set指定查询条件后批量更新:

db.getSiblingDB("corpus").getCollection("risk_control").updateMany({'channel': '77'}, {"$set": {'operator': "johnny"}})

指定多个查询条件:

db.getSiblingDB("corpus").getCollection("risk_control").updateMany({'channel': '77', 'type': 1}, {"$set": {'operator': "johnny"}})

查询

查询Server版本:

db.version();

distinct查询:

db.getSiblingDB("medhub").getCollection("case").distinct('finished');
db.getSiblingDB("cx_user").userAccount.distinct('profiles.channel');

查询某集合下某个JSON Array字段满足Array个数大于等于5的数据:

db.getSiblingDB("cx_user").userAccount.find({
	'profiles.5': {$exists: true}
});

注:profiles是一个JSON Array字段
参考stackoverflow-query-for-documents-where-array-size-is-greater-than-1

$in

findOne

sort

Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.

countDocuments

非常常用的方法,必须要掌握的入门API。

使用countDocuments查询符合某一个限制条件的集合总数:

db.getSiblingDB("medhub").getCollection("report").countDocuments({
	'translatedReports.zh-CN.profileKey': '64abd052b99c8f0008338990'
});

注:上面的translatedReports字段是一个大JSON列,通过.连字符以类似于JsonPath的方式取JSON里的Key字段。

使用countDocuments查询符合多个限制条件的集合总数:

db.getSiblingDB("medhub").getCollection("report").countDocuments({
	'translatedReports.zh-CN.profileKey': '64abd052b99c8f0008338990',
	'isDelete': false
});

使用countDocuments模糊查询符合限制条件的集合总数:

db.getSiblingDB("medhub").getCollection("report").countDocuments({
	'translatedReports.zh-CN.conditionReports.key': /::finding/,
});

注:使用/关键词字段/表示模糊查询,支持中英文字符。后面介绍的$match也支持模糊查询。

MongoDB不是传统的关系型数据库。如果是传统的关系型数据库,如MySQL,新增业务场景或需求调整,则往往需要在应用层PO里新增一个字段,对应的数据库也必须新增一个字段。如果应用新增字段后,生产环境的数据库未同步新增字段,则大概率会出现问题。这也就是我们所熟悉的数据库发布系统。

使用MongoDB,则无此担扰。应用发布后触发特定业务逻辑时,数据库会自动新增对应的字段。

使用countDocuments查询不存在某字段的数据总数:

db.getSiblingDB("medhub").getCollection("case").countDocuments({
	'alias': null,
});

注:上述查询表示早期业务里并没有alias字段,后面业务才有此字段。等价于:

db.getSiblingDB("medhub").getCollection("case").countDocuments({
	'alias': {$exists: 0},
});

aggregate

聚合查询,功能非常强大,学习门槛稍微有点高。

不带任何限制条件查询某个集合的总数:

db.getSiblingDB("sms").sms_history.aggregate([{$count: "total"}]);

aggregate使用$project查询指定字段:

db.getSiblingDB("corpus").getCollection("mds_findings").aggregate([
	{$project: {_id: 0, commonName: 1, key:1, }},
]);

注:1表示查询某字段,0表示不查询某字段,_id: 0,,默认会查询主键_id字段,如果不想查询此字段,则需要显式设置为0。

aggregate使用$project查询指定字段,并加上$match过滤符合条件的数据:

db.getSiblingDB("corpus").getCollection("mds_findings").aggregate([
	{$project: {_id: 0, key:1, minAge: 1, maxAge: 1}},
    {
      $match: {
        minAge: {$lt: 378691200,},
        maxAge: {$gt: 378691200,}
      },
    },
]);

aggregate使用$match过滤符合条件,使用$count查询总数:

db.getSiblingDB("corpus").getCollection("mds_findings").aggregate([
//  {$project: {_id: 0, commonName: 1, key:1, minAge:1, maxAge:1}},
    {
      $match: {
        minAge: {$lt: 378691200,},
        maxAge: {$gt: 378691200,}
      },
    },
    {$count: "total"}
]);

注:$count优先级大于同级$project,也就是如果两者并列时,只会得到符合条件的总数,$project不生效,并不会给指定的字段。

参考


标签:脚本,getSiblingDB,MongoDB,db,getCollection,查询,汇总,countDocuments,id
From: https://blog.51cto.com/u_15851118/8015482

相关文章

  • docker新建容器脚本
    新建一个文件夹,vimdocker.sh自动共享该文件夹#!/bin/bashXSOCK=/tmp/.X11-unixxhost+local:rootdockerrun-it\-eDISPLAY=$DISPLAY\-w/humble_ws\-v$PWD:/humble_ws\-v$XSOCK:$XSOCK\-v$HOME/.Xauthority:/root/.Xauthority\-v/dev/bus/usb:/de......
  • Shell执行脚本并输出日志文件的方法
    shell错误输出重定向到标准输出1./tmp/test.sh>/tmp/test.log2>&1>和<是文件重定向符。那么1和2是什么?shell中每个进程都和三个系统文件相关联标准输入stdin标准输出stdout标准错误stderr三个系统文件的文件描述符分别为0,1和2。所以这里2>&1的意思就是......
  • 接口自动化--postman(6)前置脚本
    请求前置脚本:发送请求之前要执行的脚本。 一。什么是前置操作?发送请求之前要执行JavaScript的脚本就叫前置操作。通过在请求、集合或文件夹的Pre-requestScript中写代码,来做的操作都叫前置操作。请求前置脚本常见作用:用来获取动态数据,签名接口数据,加密接口数据动态数据:时......
  • 智能视频监控平台EasyCVR接口调用注意事项汇总!
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • 视觉slam论文、代码汇总
    文章目录2013ARobustandModularMulti-SensorFusionApproachAppliedtoMAVNavigation2021GVINS:TightlyCoupledGNSS-Visual-InertialFusionforSmoothandConsistentStateEstimation2022IC-GVINS:ARobust,Real-Time,INS-CentricGNSS-Visual-InertialNaviga......
  • 2023级HAUT新生周赛题解汇总
    2023级HAUT新生周赛(零)熟悉周赛规则专场:2023级HAUT新生周赛(一)@21级学长专场(张子豪,张鑫,李昊阳):2023级HAUT新生周赛(二)@曹瑞峰专场:2023级HAUT新生周赛(三)@22级学姐专场(杨焱,刘振歌,周欣滢):2023级HAUT新生周赛(四)@牛浩然专场:2023级HAUT新生周赛(五)@陈兰锴专场:......
  • PowerShell系列(六):PowerShell脚本执行策略梳理
    PowerShell脚本执行策略用于控制何时以及何种方式执行PowerShell脚本。通过执行策略可以限制PowerShell脚本的执行范围,为系统管理员提供一定的安全保障。策略可以限制执行脚本的用户、限制执行脚本的来源等等。这些策略可以在计算机本地或组策略中进行配置。最终保护计算机免......
  • nacos启动脚本去除多余的javac
    github上面一个阿里巴巴开源的服务叫nacos,用途在这里不多说了,主要是在启动时他会寻找javac,但是很多服务器可能没有,所以我小小的修改了一下他的startup.sh然后给他打成了rpm包,也不知道网站可不可以直接把包传上来,这里是github的地址,乱放在一个仓库里面的:https://github.com/linux......
  • Linux平台下Oracle数据泵备份(expdp)SHELL脚本
    数据泵是Oracle10g的新特性,10g以后的版本才有。关于数据泵的理论知识参考我的Blog:Oracle10gEXPDP和IMPDP使用说明http://www.cndba.cn/Dave/article/1115 Logicalbackup.sh#!/bin/ksh#####################################################################......
  • Linux平台下RMAN全备和增量备份shell脚本
       一.一些准备知识 Oracle分归档和非归档模式。这两者的区别就是对redolog的处理。归档模式下,当一个redolog写满之后,就会把这个redolog里的内容写入归档文件,等写完之后,这个redolog就可以继续使用,如果是非归档模式下,redolog就直接覆盖了。恢复一般都需要归档......