Mongodb 使用$elemMatch子文档分组依据中的其他字段



我需要计算每天的订阅操作数。 这是我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

最新更新