数组内的Mongo Groupby日期

时间:2018-09-26 04:41:25

标签: mongodb mongoose aggregation-framework

我的数据库中有收藏集,

[
    {
        "groupName" : "testName",
        "participants" : [
            {
                "participantEmail" : "test@test.com",
                "lastClearedDate" : 12223213123
            },
             {
                "participantEmail" : "test2@test.com",
                "lastClearedDate" : 1234343243423
            }
        ],
        "messages" : [
            {
                "message":"sdasdasdasdasdasd",
                "time":22312312312,
                "sender":"test@test.com"
            },
            {
                "message":"gfdfvd dssdfdsfs",
                "time":2231231237789,
                "sender":"test@test.com"
            }
        ]
    }
]

这是组的集合,其中包含该组中的所有参与者和消息。 消息中的时间字段为时间戳。

我想获取组内的所有消息,这些消息在给定日期之后发布并按日期分组。 我写了以下代码,

      ChatGroup.aggregate([
        { $match: { group_name: groupName } },
        { $unwind: "$messages" },
        { $match: { "messages.time": { $gte: messagesFrom } } },
        {
          $project: {
            _id: 0,
            y: {
              $year: {
                $add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
              }
            },
            m: {
              $month: {
                $add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
              }
            },
            d: {
              $dayOfMonth: {
                $add: [new Date(0), { $multiply: [1000, "$messages.time"] }]
              }
            }
          }
        },
        {
          $group: {
            _id: {
              year: "$y",
              month: "$m",
              day: "$d"
            },
            messages: { $push: "$messages" },
            count: { $sum: 1 }
          }
        }
      ]).then(
        group => {
          console.log("length of messages", group);
          resolve(group);
        },
        err => {
          console.log(err);
        }
      );
    });

我得到以下输出,

[
    {
        "_id": {
            "year": 50694,
            "month": 9,
            "day": 5
        },
        "messages": [],
        "count": 3
    },
    {
        "_id": {
            "year": 50694,
            "month": 8,
            "day": 27
        },
        "messages": [],
        "count": 1
    },
    {
        "_id": {
            "year": 50694,
            "month": 8,
            "day": 26
        },
        "messages": [],
        "count": 10
    }
]

我没有收到消息,但计数正确。 另外,结果中显示的时间也不正确,例如年,日期和月。 Mongo版本是3.2。

我参考了groupby并从mongodb推送了文档,以及有关mongo group by的其他stackoverflow问题。

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

messages中添加$project

{
          $project: {
            _id: 0,
            messages : 1,
           .........
        },
}

答案 1 :(得分:1)

您的时间戳已经以秒为单位。因此,您无需将它们乘以1000即可将其转换为毫秒。

所以您的最终查询应该是这样的

ChatGroup.aggregate([
  { "$match": {
    "group_name": groupName,
    "messages.time": { "$gte": messagesFrom }
  }},
  { "$unwind": "$messages" },
  { "$match": { "messages.time": { "$gte": messagesFrom }}},
  { "$group": {
    "_id": {
      "year": { "$year": { "$add": [new Date(0), "$messages.time"] }},
      "month": { "$month": { "$add": [new Date(0), "$messages.time"] }},
      "day": { "$dayOfMonth": { "$add": [new Date(0), "$messages.time"] }}
    },
    "messages": { "$push": "$messages" },
    "count": { "$sum": 1 }
  }}
])