常用的MongoDB查询语句的示例代码


Posted in MongoDB onJuly 25, 2021

背景

最近做了几个规则逻辑。用到mongo查询比较多,就是查询交易信息跑既定规则筛选出交易商户,使用聚合管道进行统计和取出简单处理后的数据,用SQL代替业务代码逻辑的判断。

方法

MongoDB聚合使用aggregate,聚合管道采取自动向下子执行方式,基本语法格式:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

聚合框架中常用的操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

 

表达式 描述 实例
$sum 计算总和。 db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {likes"}}}])
$avg 计算平均值 db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {likes"}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {likes"}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {likes"}}}])
$push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{\(group : {_id : "\)by_user", url : {url"}}}])
$addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{\(group : {_id : "\)by_user", url : {url"}}}])
$first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{\(group : {_id : "\)by_user", first_url : {url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{\(group : {_id : "\)by_user", last_url : {url"}}}])

查询示例

示例一

部分字段说明:transAmt:交易金额,transType:交易类型,transTime:交易时间,mercNum:商户编号

查询交易信息,交易商户昨天交易笔数大于三百,交易金额累加大于三百万,这里现根据$match将交易信息筛选出来,然后使用$group根据商户编号分组,统计交易笔数和累加交易金额,将分组结果判断匹配交易笔数大于三百,交易金额大于三百万。

db.getCollection('box_order').aggregate([
  {
    $match: {
                "transTime":{$gte:ISODate("2020-01-03T00:00:00.000Z"),$lt:ISODate("2020-01-10T00:00:00.000Z")},
                "transType":"consume",
                "transStatus":{$in:["tsProcessing","success"]}
               }
  },
  {
    $group: {
                  "_id": "$mercNum",
                  "count": {"$sum": 1},
                  "totalAmt": {"$sum": "$transAmt"}
             }
  },
  {
    $match: {
                  "count": {"$gte": 300},
                  "totalAmt": {"$gte": 3000000}
                }
  }
])

示例二

部分字段说明:cardNo:交易卡号,transType:交易类型,transTime:交易时间,mercNum:商户编号

查询时间段内指定卡号下的交易商户信息。

根据卡号和交易时间将交易数据查出来,然后只显示商户号和卡号两列字段,根据商户号和卡号分组去重,再根据卡号分组,将商户号转化成一个字段变成数组。

db.getCollection('order_202011').aggregate([
  {
    "$match": {
      "detailInfo.cardNo": {
        "$in": [
          "YtCZ7KhCVG5xerKUg8bzJhVAjW/hWAWj",
          "cQ7QQ0yCVW6LhHtJNVRq2A==",
          "6KDpHmQ9s+0SQAGAUyLJ4A==",
          "cQ7QQ0yCVW7iSegn8uqIfg==",
          "ZEOcXdI4rfvswAz7dQ80hw==",
          "6KDpHmQ9s+2Nz61PPuOamw=="
        ]
      },
      "baseInfo.transTime": {
        "$gte": new Date(2020,10,01),
        "$lt": new Date(2020,10,24)
      }
    }
  },
  {
    "$project": {
      "merchantInfo.mercNum": 1,
      "detailInfo.cardNo": 1
    }
  },
  {
    "$group": {
      "_id": {
        "mercNum": "$merchantInfo.mercNum",
        "cardNo": "$detailInfo.cardNo"
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.cardNo",
      "mercNums": {
        "$push": "$_id.mercNum"
      }
    }
  }
])

示例三

根据指定商户和其他条件查询交易信息,根据卡号分组并组装成一个字段的集合,最后筛选掉id只保留cardNos数组

db.getCollection('box_order_fxq_202104').aggregate([
    {
        "$match": {
            "mercNum": "M15201812030753174730",
			"transTime": {
				"$gte": ISODate("2021-04-17T16:00:00.000Z"),
				"$lt": ISODate("2021-04-18T16:00:00.000Z")
			},
            "mercLevel": {
                "$in": [
                    "C",
                    "D",
                    "E"
                ]
            },
            "payType": "POSPAY",
            "transType": "consume",
            "cardType": "2"
        }
    },
    {
        "$group": {
            "_id": null,
            "cardNos": {
                "$push": "$cardNo"  //$addToSet
            }
        }
    },
    {
        "$project":{
            "cardNos":1,"_id":0
        }
    }
])

查询结果:

{
    "cardNos" : [
        "n2IwHHhfEAJcm6RFsoNPcBVAjW/hWAWj",
        "n2IwHHhfEAJcm6RFsoNPcBVAjW/hWAWj"
    ]
}

示例四

根据时间查询交易信息后,根据商户号分组,并将第一个交易信息存放入data字段中。(如果是需要全部的商户交易信息那么将$first修改为$push

db.getCollection('order').aggregate([
    {
        "$match": {
            "startTrxTime": {
                "$gte": ISODate("2021-07-20T16:00:00.000Z"),
                "$lt": ISODate("2021-07-21T16:00:00.000Z")
            }
        }
    },
    {
        "$group": {
            "_id": "$subMerchantNo",
            'data':{'$first': '$$ROOT'}  //$push
        }
    },
    {
        "$sort": {
            "_id": 1
        }
    }
])

尾言

最近那个到查询的大差不差,要注意的都是一些小改动,一般情况正常查就可以。后续有什么不一样的会继续补充。先到这里

到此这篇关于整理最近用的MongoDB查询语句的文章就介绍到这了,更多相关Mongo查询语句内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MongoDB 相关文章推荐
MongoDB orm框架的注意事项及简单使用
Jun 20 MongoDB
SpringBoot整合MongoDB的实现步骤
Jun 23 MongoDB
MongoDB安装使用并实现Python操作数据库
Jun 28 MongoDB
mongodb数据库迁移变更的解决方案
Sep 04 MongoDB
阿里云服务器部署mongodb的详细过程
Sep 04 MongoDB
MongoDB连接数据库并创建数据等使用方法
Nov 27 MongoDB
剖析后OpLog订阅MongoDB的数据变更就没那么难了
Feb 24 MongoDB
MongoDB数据库部署环境准备及使用介绍
Mar 21 MongoDB
MongoDB修改oplog大小的四种方法
Apr 11 MongoDB
MongoDB数据库之添删改查
Apr 26 MongoDB
Mongo服务重启异常问题的处理方法
Jul 01 #MongoDB
MongoDB安装使用并实现Python操作数据库
浅析MongoDB之安全认证
Jun 26 #MongoDB
SpringBoot整合MongoDB的实现步骤
Jun 23 #MongoDB
详解MongoDB的条件查询和排序
Jun 23 #MongoDB
MongoDB orm框架的注意事项及简单使用
Jun 20 #MongoDB
MongoDB 常用的crud操作语句
Jun 20 #MongoDB
You might like
PHP 变量定义和变量替换的方法
2009/07/30 PHP
PHP安全防范技巧分享
2011/11/03 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
vuex的简单使用教程
2018/02/02 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
python人民币小写转大写辅助工具
2018/06/20 Python
python读取Excel实例详解
2018/08/17 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
python datetime中strptime用法详解
2019/08/29 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
python一些性能分析的技巧
2020/08/30 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
荟萃全球保健品:维他购
2018/05/09 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
高中语文课后反思
2014/04/27 职场文书
大学新闻系自荐书
2014/05/31 职场文书
工伤私了协议书范本
2014/11/24 职场文书
奠基仪式致辞
2015/07/30 职场文书
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏