Mongo 按日期汇总总和并分组项目

Nee*_*raj 3 aggregate mongodb

非常感谢您的时间。我正在处理一个集合,我想对同一日期的项目求和。考虑以下示例,这里我有两个文档,其中存储了 user_id 和 played 事件。我想总结那些日期相同的文件。在我的案例日期中,2017-01-25 有两个结果,而 2017-01-26 只有一个。请查看预期的结果。

{
    "_id" : ObjectId("58891b5656a961427e7b23c6"),
    "user_id" : 122,
    "played_event" : [ 
        {
            "date" : ISODate("2017-01-25T21:43:48.146Z"),
            "totalPlayed" : 0,
        }, 
        {
            "date" : ISODate("2017-01-26T22:26:03.273Z"),
            "totalPlayed" : 838,
        }, 
    ]
}

{
    "_id" : ObjectId("58891b5656a961427e7b23f3"),
    "user_id" : 130,
    "played_event" : [ 
        {
            "date" : ISODate("2017-01-25T21:43:48.146Z"),
            "totalPlayed" : 0,
        }, 
        {
            "date" : ISODate("2017-01-30T22:26:03.273Z"),
            "totalPlayed" : 838,
        }, 
    ]
}
Run Code Online (Sandbox Code Playgroud)

预期结果

{
    "result" : [ 
        {
            "date" : "2017-01-25"
            "sum" : 2
        }, 
        {
            "date":"2017-01-26"
            "sum":1
        }, 
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下代码

[{"$unwind":"$played_event"},{"$match":{"$and":[{"played_event.date":{"$lte":{"sec":1530766799,"usec":0},"$gte":{"sec":1530162000,"usec":0}}},{"game_id":1}]}},{"$match":{"user_id":{"$nin":[1,2]}}},{"$group":{"_id":"$user_id","total":{"$sum":"$played_event.totalPlayed"},"events":{"$push":"$played_event.date"}}},{"$project":{"_id":0,"user_id":"$_id","total":1,"events":1}}]
Run Code Online (Sandbox Code Playgroud)

但它没有给我预期的结果,我在我的查询中总结了 totalPlayed,但目前不需要。

Ash*_*shh 5

首先,您需要$unwind"played_event",然后你需要$group通过将所需的格式"date"使用$dateToString

db.collection.aggregate([
  { "$unwind": "$played_event" },
  { "$group": {
    "_id": {
      "$dateToString": {
        "format": "%Y-%m-%d",
        "date": "$played_event.date"
      }
    },
    "sum": { "$sum": 1 }
  }},
  { "$project": {
    "date": "$_id",
    "sum": 1,
    "_id": 0
  }}
])
Run Code Online (Sandbox Code Playgroud)

输出

[
  {
    "date": "2017-01-30",
    "sum": 1
  },
  {
    "date": "2017-01-26",
    "sum": 1
  },
  {
    "date": "2017-01-25",
    "sum": 2
  }
]
Run Code Online (Sandbox Code Playgroud)