【问题标题】:Aggregation per year and month in MongoDBMongoDB中每年和每月的聚合
【发布时间】:2023-04-01 00:07:02
【问题描述】:

说明:我有一个数组名称作为代码,我有一个查询参数名称为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
    },
  ]
}

【问题讨论】:

    标签: arrays mongodb mongoose mongodb-query aggregation-framework


    【解决方案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 conditionFREEMARKER你能按照设置吗?或详细说明。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2013-12-31
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多