我正在尝试创建一个查询,用于计算用户在1个月内完成操作的次数。
这是数据格式:
[
{
"happened": ISODate(2017-1-1),
"user": ObjectId(a),
"action": ObjectId(i)
},
{
"happened": ISODate(2017-1-1),
"user": ObjectId(a),
"action": ObjectId(i)
}
]
我想了解用户在一段时间内完成某项操作的次数。
我已经找到了$match
:
{
$match: {
happened: { $gte: 2017-1-1, $lt: 2017-2-1 },
action: i
}
}
我也在试验$group
位,但我无法弄清楚如何得到我想要的东西。这就是我到目前为止所做的:
{
$group: {
_id: {
user: "$user",
year: { $year: "$happened" },
day: { $dayOfYear: "$happened" }
},
count: { $sum: 1 }
}
}
我想为每个用户查看他们执行操作的天数。但我无法超越这个:
[
{
"_id": {
"user": ObjectId(a),
"year": ObjectId(2017),
"day": ObjectId(1)
},
"count": 1
},
{
"_id": {
"user": ObjectId(a),
"year": ObjectId(2017),
"day": ObjectId(2)
},
"count": 1
}
]
您可以看到我获得了每个用户的实例数,但每天也会显示。我想看看每个用户有多少天。
答案 0 :(得分:1)
您可以$push
将根文档发送到临时数组,$unwind
并再次创建一个组,获取先前计算的天数的第一个值:
db.data.aggregate([{
$match: {
happened: { $gte: ISODate("2017-01-01"), $lt: ISODate("2017-02-01") },
action: "Action1"
}
}, {
$group: {
_id: {
day: { $dayOfMonth: "$happened" }
},
dayCount: { $sum: 1 },
doc: { $push: "$$ROOT" }
}
}, {
$unwind: "$doc"
}, {
$group: {
_id: "$doc.user",
dayCount: { $first: "$dayCount" },
actionCount: { $sum: 1 }
}
}])
它为您提供userId,dayCount(至少执行一个操作的天数)和actionCount:
{ "_id" : "1", "dayCount" : 2, "actionCount" : 2 }
{ "_id" : "2", "dayCount" : 3, "actionCount" : 4 }
答案 1 :(得分:1)
您可以尝试以下聚合。
首先$group
为每个用户提供不同的日期,然后$group
到$push
不同的日期,$project
计算日期。
{ $group: { _id: { user: "$user", day: { $dayOfMonth: "$happened" } } } },
{ $group: { _id: "_id.$user", days:{$push:"$_id.day"} } },
{ $project: { user:"$user", count: { $size: "$days" } } }