查询以按天分组的数组中的出现次数

时间:2018-01-15 06:58:19

标签: mongodb mongodb-query aggregation-framework

我有以下文档结构:

(trackerEventsCollection) = 
    {
        "_id" : ObjectId("5b26c4fb7c696201040c8ed1"),
        "trackerId" : ObjectId("598fc51324h51901043d76de"),
        "trackingEvents" : [ 
            {
                "type" : "checkin",
                "eventSource" : "app",
                "timestamp" : ISODate("2017-08-25T06:34:58.964Z")
            }, 
            {
                "type" : "power",
                "eventSource" : "app",
                "timestamp" : ISODate("2017-08-25T06:51:23.795Z")
            }, 
            {
                "type" : "position",
                "eventSource" : "app",
                "timestamp" : ISODate("2017-08-25T06:51:23.985Z")        
            }
        ]
    }

我想编写一个查询,该查询将计算按日分组的"type" : "power"类型的trackingEvents数。这似乎对我来说非常棘手,因为父文档没有日期,我应该依赖属于timestamp数组成员的trackingEvents字段。 我没有真正体验过mongodb用户,也无法理解到目前为止如何实现这一目标。 非常感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:1)

要将嵌套数组作为单独的文档处理,您需要使用$unwind.在下一阶段,您可以使用$ match按type过滤掉。然后你可以通过计算出现的单日进行分组。关键是您必须构建包含年,月和日的分组键,如下面的代码所示:

db.trackerEvents.aggregate([
    { $unwind: "$trackingEvents" },
    { $match: { "trackingEvents.type": "power" } },
    {
        $group: {
            _id: {
                year: { $year:"$trackingEvents.timestamp" },
                month:{ $month:"$trackingEvents.timestamp" },
                day: { $dayOfMonth:"$trackingEvents.timestamp" }
            },
            count: { $sum: 1 }
        }
    }
])