我有一个使用MongoDB编写的分析API。
这是我的会话模型
const sessionSchema = new Schema(
{
user: { id: Number, name: String, email: String },
},
{ timestamps: true },
);
我想按日期获取不重复用户数。
对于日期2019-10-24,可能有来自两个用户的10个会话(ID 1,ID 2) 和
对于日期2019-10-25,可能有两个用户(id 3,id 8)进行了20次会话
所以我的预期结果是
2019-10-24 2位用户
2019-10-25 2位用户
我尝试过
db.Session.aggregate([
{
$group: {
_id: { user: '$user.id', day: { $dayOfYear: '$createdAt' } },
count: { $sum: 1 },
},
},
])
这似乎不起作用。
我的createdAt
字段的类型为Date
(例如:-createdAt:2019-10-16T13:11:17.935Z)这就是为什么我使用$dayOfYear: '$createdAt'
答案 0 :(得分:2)
db.Session.aggregate([
{
$project: {
date: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }
}
},
{
$group: {
_id: "$date" ,
count: { $sum: 1 }
}
}
]);
答案 1 :(得分:0)
根据 createdAt 在第一组,因为我们希望根据createdAt获得最终结果。
在此$group
阶段中,只需将 userIds推入数组,使用 $addToSet
使其保持唯一
然后在$size
阶段使用 $project
运算符获取userId的数量。
您得到结果。
这是查询。
(根据需要转换日期,它只是一种格式,而您已经完成了此操作,因此我跳过了此任务)。
db.sessions.aggregate({$match:{}},
{$group:{_id: "$createdAt", userId : {$addToSet: "$user.id"}}},
{$project:{_id: 1, noOfUsers:{$size:"$userId"}}}).pretty()
希望这会有所帮助!