我需要计算每天的订阅操作数。 这是我user_events收藏:
[
{
"user_id": 5,
"events": [
{
"date": ISODate("2018-10-17T15:51:06.000Z"),
"action": "subscribe"
},
{
"date": ISODate("2018-10-18T15:51:06.000Z"),
"action": "unsubscribe"
},
{
"date": ISODate("2018-10-16T15:51:06.000Z"),
"action": "charge"
},
{
"date": ISODate("2018-10-19T15:51:06.000Z"),
"action": "subscribe"
}
]
},
{
"user_id": 6,
"events": [
{
"date": ISODate("2018-10-6T15:51:06.000Z"),
"action": "subscribe"
},
{
"date": ISODate("2018-10-17T15:51:06.000Z"),
"action": "unsubscribe"
},
{
"date": ISODate("2018-10-10T15:51:06.000Z"),
"action": "charge"
},
{
"date": ISODate("2018-10-26T15:51:06.000Z"),
"action": "send-code"
},
{
"date": ISODate("2018-10-11T15:51:06.000Z"),
"action": "charge"
},
{
"date": ISODate("2018-10-18T15:51:06.000Z"),
"action": "subscribe"
}
]
},
]
我需要根据订阅日期聚合数据。 所以只有带有操作的子文档:订阅应该计入查询结果。
所以我的结果应该是:
{"2018-10-18": 2, "2018-10-06": 1, "2018-10-17":2, "2018-10-19":1}
请考虑我只想将具有订阅操作的子文档计入我的结果中。
您应该能够通过这样的事情来实现这一点:
db.collection.aggregate([
{
$project: {
events: {
$filter: {
input: "$events",
as: "event",
cond: {
$eq: [
"$$event.action",
"subscribe"
]
}
}
}
}
},
{
$unwind: "$events"
},
{
$addFields: {
day: {
$dateToString: {
format: "%Y-%m-%d",
date: "$events.date"
}
}
}
},
{
$group: {
_id: "$day",
count: {
$sum: 1
}
}
}
])
这个想法是首先$filter我们$unwind之后的subscribe
事件。
然后添加日期字段(通过 $addFields 和 $dateToString(,我们将在最后阶段对其进行分组。
您可以在此处看到此操作
您还可以附加:
{
"$project": {
"_id": 0,
"day": "$_id",
"count": "$count"
}
}
如果您想获得day
而不是_id