我需要计算每天的订阅操作数。 这是我的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"
}
]
},
]
我需要根据订阅日期汇总数据。 因此只有带有action的子文档:subscribe应该计入查询结果中。
所以我的结果应该是:
{"2018-10-18": 2, "2018-10-06": 1, "2018-10-17":2, "2018-10-19":1}
请考虑我只希望将具有订阅操作的子文档计入我的结果。
答案 0 :(得分: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
}
}
}
])
这个想法首先是在subscribe
事件上$filter,之后是$unwind。
然后添加日期字段(通过$addFields和$dateToString),上一阶段我们将在该字段上grouping。
您可以看到此working here
您还可以附加:
{
"$project": {
"_id": 0,
"day": "$_id",
"count": "$count"
}
}
如果您想获得day
而不是_id