我正在尝试构建一个返回用户总数和上周创建的用户数的查询。 这里有一个名为 timeStamp 的字段,代表创建日期。
我试图通过聚合来做这件事,我想我应该首先按 timeStamp 对所有用户进行分组,但后来我不知道我该怎样做才能实现这一点。
修改: 示例用户文档:
{
"_id" : ObjectId("57be35d6fab7762415376b1b"),
"provider" : "local",
"isValidAccount" : true,
"isActive" : true,
"timeStamp" : ISODate("2016-08-25T00:03:34.533Z"),
"scope" : "getm-user",
"tkbSponsor" : "example@example.com",
"userId" : "example@example.com",
"passwd" : "$2a$14$WARJLD4RtYOApJvTNwQHluLvWpZzQzvUxudIln.j5aQJaxYsJtHEG",
"posFavorites" : [ ],
}
我需要的是所有用户的数量以及7天前创建的所有用户的另一个数量。
答案 0 :(得分:2)
首先需要创建一个满足上周创建的用户给定条件的日期范围查询,这意味着定义两个变量,这些变量将保存代表上周和结束日期开始的日期对象。稍后您将需要它来查询您的集合。
您可以从 $group
管道步骤开始,该步骤将对集合中的所有文档进行分组,并使用 $sum
计算总文档数。您还可以使用 $cond
tenary运算符根据日期范围计算条件总和,以提供 $sum
。
以下解释了上述方法:
var today = new Date();
var lastWeekStart = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7);
var lastWeekEnd = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7);
var start = new Date(lastWeekStart.setHours(0,0,0,0));
var end = new Date(lastWeekEnd.setHours(23,59,59,999));
db.collection.aggregate([
{
"$group": {
"_id": null,
"total": { "$sum": 1 },
"usersCreatedLastWeek": {
"$sum": {
"$cond": [
{
"$and": [
{ "$gte": [ "$timeStamp", start ] },
{ "$lte": [ "$timeStamp", end ] }
]
},
1,
0
]
}
}
}
}
])
答案 1 :(得分:2)