GroupBy按日期+ mongodb

时间:2018-10-08 05:47:02

标签: node.js mongodb group-by

我必须根据给定文档的月份汇总结果。考虑以下内容作为我的文档:

{
    "_id" : ObjectId("5b3314a12b05b1b247366f48"),
    "email" : "abc@gmail.com",
    "qwerty":[{
            "id" : "5ba4ebbad1b5eaf038841302",
            "status" : "inprogress",           
            "Date" : "2018-08-20"
        }, 
        {
            "id" : "5ba4ebbad1b5eaf038841303",
            "status" : "inprogress",           
            "Date" : "2018-08-20"
        }]

以下是我的查询:

var query =[
        { $match: {"email":email} },
        {$unwind: "$courses" },
        {$group:{_id:{$substrCP: ["$qwerty.Date", 5, 2]},count:{$sum:1}}}
    ];

它正常工作。但是我$substrCP: ["$qwerty.Date", 5, 2]的日期格式是“ 2018-08-20”,如果“ 20-08-2018”呢?因此可以将上面的查询更改为适应nay类型。

我也尝试使用新的Date("").getMonth(),但显示为“ NaN”,我知道无法在组内部使用。

请提出您的想法。

1 个答案:

答案 0 :(得分:0)

您可以结合使用$month$dateFromString来获得所需的内容:

db.collection.aggregate([
  {
    $match: {
      "email": "abc@gmail.com"
    }
  },
  {
    $unwind: "$qwerty"
  },
  {
    $group: {
      _id: {
        $month: {
          $dateFromString: {
            dateString: "$qwerty.Date"
          }
        }
      },
      count: {
        $sum: 1
      }
    }
  }
])

您可以see it here使用两种不同的日期格式。

要按日期分组,您可以在没有$month的情况下执行相同的操作:

db.collection.aggregate([
  {
    $match: {
      "email": "abc@gmail.com"
    }
  },
  {
    $unwind: "$qwerty"
  },
  {
    $group: {
      _id: {
        $dateFromString: {
          dateString: "$qwerty.Date"
        }
      },
      count: {
        $sum: 1
      }
    }
  }
])

查看此版本here