Mongodb聚合基于日期或时间戳的月份计数

时间:2020-10-22 08:42:10

标签: node.js mongodb mongoose mongodb-query aggregation-framework

这是我的mongodb结构,我需要聚合帮助

{
    "_id": {
        "$oid": "5f7c2b6ee63ba648209754f1"
    },
    "duration": 23,
    "country": "India",
    "countryCode": "IN",   
    "city": "tamilnadu
    "date": "10/06/2020",
    "timeStamp": "2020-10-06T08:31:42.768Z",
    "__v": 0
}
{
    "_id": {
        "$oid": "5f7c2b7ce63ba648209754f2"
    },
   
    "duration": 12,
    "country": "India",
    "countryCode": "IN", 
    "date": "10/06/2020",  
    "timeStamp": "2020-10-06T08:31:56.438Z",
    "__v": 0
}

我需要帮助以按月排序

我需要的输出类似于基于日期或时间戳的月份计数和月份名称

[
    {
        "data": {
            "October-2020": 489
        },
       data:{
"august-2020":12
}

    }
]

1 个答案:

答案 0 :(得分:0)

您可以尝试

  • $addFields使用$toDate将字符串日期转换为ISO日期,如果您已经具有ISO日期格式,则可以跳过此阶段
  • $group按月和年
    • 使用$month形式timeStamp获取月份,并使用$let从月份数组转换为字符串格式
    • 使用$year中的timeStamp获取年份,并使用$toString转换为字符串格式,因为$concat仅连接字符串
    • $concat用单个字符串连接月份和年份
  • 使用$sum
  • 获取分组文档的数量
  • $project以显示数据字段并使用$arrayToObject
  • 以对象格式转换结果
let months = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
db.collection.aggregate([
  { $addFields: { timeStamp: { $toDate: "$timeStamp" } } },
  {
    $group: {
      _id: {
        $concat: [
          {
            $let: {
              vars: { monthsInString: months },
              in: { $arrayElemAt: ["$$monthsInString", { $month: "$timeStamp" }] }
            }
          },
          "-",
          { $toString: { $year: "$timeStamp" } }
        ]
      },
      count: { $sum: 1 }
    }
  },
  {
    $project: {
      _id: 0,
      data: {
        $arrayToObject: [
          [{ k: "$_id", v: "$count" }]
        ]
      }
    }
  }
])

Playground