• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
123456833 显示全部楼层 发表于 2021-8-14 14:55:40 |阅读模式 打印 上一主题 下一主题
目次


  • 背景
  • 方法
  • 查询示例

    • 示例一
    • 示例二
    • 示例三
    • 示例四

  • 尾言

背景

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

方法

MongoDB聚合使用
  1. aggregate
复制代码
,聚合管道接纳自动向下子实行方式,根本语法格式:
  1. 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 : {sum:"likes"}}}])                            $avg            盘算均匀值            db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {avg:"likes"}}}])                            $min            获取集合中所有文档对应值得最小值。            db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {min:"likes"}}}])                            $max            获取集合中所有文档对应值得最大值。            db.mycol.aggregate([{\(group : {_id : "\)by_user", num_tutorial : {max:"likes"}}}])                            $push            在结果文档中插入值到一个数组中。            db.mycol.aggregate([{\(group : {_id : "\)by_user", url : {push:"url"}}}])                            $addToSet            在结果文档中插入值到一个数组中,但不创建副本。            db.mycol.aggregate([{\(group : {_id : "\)by_user", url : {addToSet:"url"}}}])                            $first            根据资源文档的排序获取第一个文档数据。            db.mycol.aggregate([{\(group : {_id : "\)by_user", first_url : {first:"url"}}}])                            $last            根据资源文档的排序获取末了一个文档数据            db.mycol.aggregate([{\(group : {_id : "\)by_user", last_url : {last:"url"}}}])        

查询示例


示例一

部分字段分析:transAmt:生意业务金额,transType:生意业务类型,transTime:生意业务时间,mercNum:商户编号
查询生意业务信息,生意业务商户昨天生意业务笔数大于三百,生意业务金额累加大于三百万,这里现根据
  1. $match
复制代码
将生意业务信息筛选出来,然后使用
  1. $group
复制代码
根据商户编号分组,统计生意业务笔数和累加生意业务金额,将分组结果判断匹配生意业务笔数大于三百,生意业务金额大于三百万。
  1. db.getCollection('box_order').aggregate([
  2.   {
  3.     $match: {
  4.                 "transTime":{$gte:ISODate("2020-01-03T00:00:00.000Z"),$lt:ISODate("2020-01-10T00:00:00.000Z")},
  5.                 "transType":"consume",
  6.                 "transStatus":{$in:["tsProcessing","success"]}
  7.                }
  8.   },
  9.   {
  10.     $group: {
  11.                   "_id": "$mercNum",
  12.                   "count": {"$sum": 1},
  13.                   "totalAmt": {"$sum": "$transAmt"}
  14.              }
  15.   },
  16.   {
  17.     $match: {
  18.                   "count": {"$gte": 300},
  19.                   "totalAmt": {"$gte": 3000000}
  20.                 }
  21.   }
  22. ])
复制代码
示例二

部分字段分析:cardNo:生意业务卡号,transType:生意业务类型,transTime:生意业务时间,mercNum:商户编号
查询时间段内指定卡号下的生意业务商户信息。
根据卡号和生意业务时间将生意业务数据查出来,然后只表现商户号和卡号两列字段,根据商户号和卡号分组去重,再根据卡号分组,将商户号转化成一个字段变成数组。
  1. db.getCollection('order_202011').aggregate([
  2.   {
  3.     "$match": {
  4.       "detailInfo.cardNo": {
  5.         "$in": [
  6.           "YtCZ7KhCVG5xerKUg8bzJhVAjW/hWAWj",
  7.           "cQ7QQ0yCVW6LhHtJNVRq2A==",
  8.           "6KDpHmQ9s+0SQAGAUyLJ4A==",
  9.           "cQ7QQ0yCVW7iSegn8uqIfg==",
  10.           "ZEOcXdI4rfvswAz7dQ80hw==",
  11.           "6KDpHmQ9s+2Nz61PPuOamw=="
  12.         ]
  13.       },
  14.       "baseInfo.transTime": {
  15.         "$gte": new Date(2020,10,01),
  16.         "$lt": new Date(2020,10,24)
  17.       }
  18.     }
  19.   },
  20.   {
  21.     "$project": {
  22.       "merchantInfo.mercNum": 1,
  23.       "detailInfo.cardNo": 1
  24.     }
  25.   },
  26.   {
  27.     "$group": {
  28.       "_id": {
  29.         "mercNum": "$merchantInfo.mercNum",
  30.         "cardNo": "$detailInfo.cardNo"
  31.       }
  32.     }
  33.   },
  34.   {
  35.     "$group": {
  36.       "_id": "$_id.cardNo",
  37.       "mercNums": {
  38.         "$push": "$_id.mercNum"
  39.       }
  40.     }
  41.   }
  42. ])
复制代码
示例三

根据指定商户和其他条件查询生意业务信息,根据卡号分组并组装成一个字段的集合,末了筛选掉id只生存cardNos数组
  1. db.getCollection('box_order_fxq_202104').aggregate([
  2.     {
  3.         "$match": {
  4.             "mercNum": "M15201812030753174730",
  5.                         "transTime": {
  6.                                 "$gte": ISODate("2021-04-17T16:00:00.000Z"),
  7.                                 "$lt": ISODate("2021-04-18T16:00:00.000Z")
  8.                         },
  9.             "mercLevel": {
  10.                 "$in": [
  11.                     "C",
  12.                     "D",
  13.                     "E"
  14.                 ]
  15.             },
  16.             "payType": "POSPAY",
  17.             "transType": "consume",
  18.             "cardType": "2"
  19.         }
  20.     },
  21.     {
  22.         "$group": {
  23.             "_id": null,
  24.             "cardNos": {
  25.                 "$push": "$cardNo"  //$addToSet
  26.             }
  27.         }
  28.     },
  29.     {
  30.         "$project":{
  31.             "cardNos":1,"_id":0
  32.         }
  33.     }
  34. ])
复制代码
查询结果:
  1. {
  2.     "cardNos" : [
  3.         "n2IwHHhfEAJcm6RFsoNPcBVAjW/hWAWj",
  4.         "n2IwHHhfEAJcm6RFsoNPcBVAjW/hWAWj"
  5.     ]
  6. }
复制代码
示例四

根据时间查询生意业务信息后,根据商户号分组,并将第一个生意业务信息存放入data字段中。(如果是必要全部的商户生意业务信息那么将
  1. $first
复制代码
修改为
  1. $push
复制代码
  1. db.getCollection('order').aggregate([
  2.     {
  3.         "$match": {
  4.             "startTrxTime": {
  5.                 "$gte": ISODate("2021-07-20T16:00:00.000Z"),
  6.                 "$lt": ISODate("2021-07-21T16:00:00.000Z")
  7.             }
  8.         }
  9.     },
  10.     {
  11.         "$group": {
  12.             "_id": "$subMerchantNo",
  13.             'data':{'$first': '$$ROOT'}  //$push
  14.         }
  15.     },
  16.     {
  17.         "$sort": {
  18.             "_id": 1
  19.         }
  20.     }
  21. ])
复制代码
尾言

迩来谁人到查询的大差不差,要注意的都是一些小改动,一样寻常情况正常查就可以。后续有什么不一样的会继续增补。先到这里
到此这篇关于整理迩来用的MongoDB查询语句的文章就先容到这了,更多相关Mongo查询语句内容请搜索草根技能分享以前的文章或继续浏览下面的相关文章盼望各人以后多多支持草根技能分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作