MongoDB中每年和每月的聚合

Posted

技术标签:

【中文标题】MongoDB中每年和每月的聚合【英文标题】:Aggregation per year and month in MongoDB 【发布时间】:2021-08-10 15:49:43 【问题描述】:

说明:我有一个数组名称作为代码,我有一个查询参数名称为year(下拉列表2016,2017,2018,2019,....) 和@987654322 @ 下拉列表为 (ALL,01,02,03,04,05,06,07,08,09,10,11,12)。

CASE1:如果用户选择特定年份和特定月份,则相应地获取 code 数组。

CASE2:如果用户选择特定年份和月份ALL,则获取code数组完整年份。


  "code":[
    
      "k": "2016-06-18T18",
      "v": 1
    ,
    
      "k": "2016-06-18T21",
      "v": 2
    ,
    
      "k": "2016-07-19T00",
      "v": 13
    ,
    
      "k": "2015-06-19T03",
      "v": 6
    ,
    
      "k": "2015-07-19T06",
      "v": 6
    
  ]

CASE 1 预期输出如果用户选择:从年份下拉列表:2016 年,月份:06


  "code":[
    
      "k": "2016-06-18T18",
      "v": 1
    ,
    
      "k": "2016-06-18T21",
      "v": 2
    
  ]

如果用户选择了案例 2 预期输出:从年份下拉列表:2016 年,月份:ALL


  "code":[
    
      "k": "2016-06-18T18",
      "v": 1
    ,
    
      "k": "2016-06-18T21",
      "v": 2
    ,
    
      "k": "2016-07-19T00",
      "v": 13
    ,
  ]

【问题讨论】:

【参考方案1】: 初始化请求参数
var year = req.year;
var month = req.month;
设置默认年份条件
var condition = [
  $eq: [ $substr: ["$$this.k", 0, 4] , String(year)]
];
检查月份是否可用,然后添加条件
if (month && month != "all") 
  condition.push(
    $eq: [ $substr: ["$$this.k", 5, 2] , String(month)] 
  );

$filter 迭代代码循环并过滤以上准备好的条件
db.collection.aggregate([
  
    $set: 
      code: 
        $filter: 
          input: "$code",
          cond:  $and: condition 
        
      
    
  
])

Playground

【讨论】:

谢谢你的解释真的很棒,但是你能不能一次性查询,我不明白你是怎么设置If condition 的。 CASE 1,工作正常,但 CASE 2 对我来说不能正常工作。 它是按顺序排列的,您可以按顺序排列,对于第二种情况,请验证您的 if 条件,将“all”替换为您在全选时通过的值..并尝试将月份传入像“01”、“02”这样的字符串...... 尝试在查询之前和if条件之后控制台condition字段,并用值显示实际条件.. 对不起,我没明白。condition 对我来说不能正常工作,我正在使用 来制作 if condition。 FREEMARKER你能按照设置吗?或详细说明。谢谢!

以上是关于MongoDB中每年和每月的聚合的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬日期比较没有时间和按createdAt和staffId分组,每周、每月和每年按聚合计算的员工总数?

mongodb Aggregation聚合操作之$facet

mongodb Aggregation聚合操作之$sort

Mongodb中数据聚合之聚合管道aggregate

Mongodb的聚合和管道

mongodb Aggregation聚合操作之$bucket