整理最近用的Mongo查询语句

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

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

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

聚合框架中常用的操作:

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

表达式 描述 实例 $sum 计算总和。 db.mycol.aggregate([{

by_user”, num_tutorial : {

likes”}}}]) $avg 计算平均值 db.mycol.aggregate([{

by_user”, num_tutorial : {

likes”}}}]) $min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{

by_user”, num_tutorial : {

likes”}}}]) $max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{

by_user”, num_tutorial : {

likes”}}}]) $push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{

by_user”, url : {

url”}}}]) $addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{

by_user”, url : {

url”}}}]) $first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{

by_user”, first_url : {

url”}}}]) $last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{

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
        }
    }
])

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

Original: https://www.cnblogs.com/dearsusu/p/15048714.html
Author: 青衫染红尘
Title: 整理最近用的Mongo查询语句

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715325/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 快读,快输

    快读 #define gc getchar inline ll read(){ ll a=0;int f=0;char p=gc(); while(!isdigit(p)){f|=…

    技术杂谈 2023年7月11日
    071
  • 支付功能测试点

    支付金额 1.小于最小值,如:小于0.01 2.大于最大值/金额上限 3.无实际意义金额,如0元 4.格式错误(负数、非数字) 5.余额小于实际需要支付的金额 6.超过第三方支付接…

    技术杂谈 2023年5月31日
    0111
  • veer图库网站爬取

    记录一下当时同学托我帮写的爬取veer图库链接的python代码 csharp;gutter:true;</p> <h1>!/usr/bin/env pyt…

    技术杂谈 2023年6月21日
    0128
  • tcprstat和tcpstat性能监控

    tcprstat是percona用来监测mysql响应时间的。不过对于任何运行在TCP协议上的响应时间,都可以用。 下面是一个监控示例,监控分析mysql的3306端口。 根据上面…

    技术杂谈 2023年5月31日
    0116
  • 基于UiAutomator2+PageObject模式开展APP自动化测试实战

    前言 在上一篇《APP自动化测试框架-UiAutomator2基础》中,重点介绍了uiautomator2的项目组成、运行原理、环境搭建及元素定位等基础入门知识,本篇将介绍如何基于…

    技术杂谈 2023年7月25日
    084
  • 学习用具汇总

    透明硅胶软垫 写字舒服,不用担心桌子太硬写字难受!省力。外出考试带着,不用担心桌子太破把试卷戳破。搜索的时候就搜:考试专用透明垫板。 活页笔记本 可撕黑色横线信纸 每张都能撕下来,…

    技术杂谈 2023年6月1日
    095
  • 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈…

    技术杂谈 2023年5月31日
    099
  • Git rebase 合并多次提交

    在一般研发管理流程中,我们一般都是这么使用Git版本的: 0、先拿到一个需求(不细谈需求前面的采集、归纳整理、确认及评审等环节) 1、从主分支checkout一个新分支 2、在完成…

    技术杂谈 2023年7月11日
    093
  • 数据仓库之汇总层(DWS)设计概要

    合理的数据仓库分层一方面能够降低耦合性,提高重用性,可读性可维护性,另一方面也能提高运算的效率,影响到数据需求迭代的速度,近而影响到产品决策的及时性。建立数据分层可以提炼公共层,避…

    技术杂谈 2023年5月31日
    0120
  • tomcat指定jre

    tomcat如果不经过配置的话是默认使用环境变量里的JAVA_HOME和JRE_HOME,但是有些时候我们可能会想要指定特定的jre,比如旧版本的,这个时候就需要修改tomcat的…

    技术杂谈 2023年6月1日
    063
  • npm install 安装依赖无反应

    1、显示当前使用的镜像: // 把下面这个命令粘贴到 cmd 或终端上执行npm get registry 如果显示当前使用的是默认镜像,那就需要按照淘宝镜像 2、安装淘宝镜像: …

    技术杂谈 2023年5月31日
    0103
  • jd-gui反编译报错// INTERNAL ERROR //

    最近在反编译class和jar包的时候,发现部分class无法反编译出来,换了最新版本的jd-gui和多个版本都不行,只能放弃了 解决方案:GitHub上找Luyten这个工具反编…

    技术杂谈 2023年5月31日
    093
  • 关于戴德金分割的几点思考

    谨以此文纪念杨振宁、李政道先生获得诺贝尔物理学奖60周年. 由无理数引发的数学危机一直延续到19世纪,直到1872年,德国数学家戴德金从连续性的要求出发,用有理数的”分…

    技术杂谈 2023年5月31日
    083
  • mybatis学习思维导图——附b站视频网址和百度网盘(来自动力节点)

    三层架构 mybatis框架 mybatis实战 框架的使用方式 mybatis框架的使用步骤: mybatis的传参数 #和$区别 mybatis封装sql语句的执行结果 表的列…

    技术杂谈 2023年7月24日
    0103
  • 23种设计模式之解释器模式(Interpreter)

    文章目录 概述 解释器模式的优缺点 解释器模式的结构和实现 * 模式结构 模式实现 JDK源码中的使用场景 总结 概述 解释器模式(Interpreter Pattern)提供了评…

    技术杂谈 2023年7月24日
    084
  • ASP.NET CORE WEB项目介绍

    首先创建一个asp.net core web应用程序 第二步 目前官方预置了7种模板项目供我们选择。从中我们可以看出,既有我们熟悉的MVC、WebAPI,又新添加了Razor Pa…

    技术杂谈 2023年6月21日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球