MongoDB在一个查询中查找上周和以后创建的记录
我正在尝试构建一个查询,返回用户总数和上周创建的用户数。 有一个名为timeStamp的字段,表示创建日期 我正试图通过聚合来实现这一点,我想我应该首先按照时间戳对所有用户进行分组,但我不知道我能做些什么来实现这一点 编辑: 用户文档示例:MongoDB在一个查询中查找上周和以后创建的记录,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试构建一个查询,返回用户总数和上周创建的用户数。 有一个名为timeStamp的字段,表示创建日期 我正试图通过聚合来实现这一点,我想我应该首先按照时间戳对所有用户进行分组,但我不知道我能做些什么来实现这一点 编辑: 用户文档示例: { "_id" : ObjectId("57be35d6fab7762415376b1b"), "provider" : "local", "isValidAccount" : true, "isActive" : true,
{
"_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天前创建的所有用户的计数和另一个7天前创建的所有用户的计数。您首先需要创建一个日期范围查询,以满足上周创建的用户的给定条件,这意味着定义两个变量,这两个变量将保存表示上周开始和结束的日期对象。稍后在管道中查询您的集合时将需要此选项 您可以从管道步骤开始,该步骤将集合中的所有文档分组,并使用计算文档总数。您还可以使用十进制运算符根据日期范围计算条件和,以馈送 以下解释了上述方法:
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
]
}
}
}
}
])
您首先需要创建一个日期范围查询,以满足上周创建的用户的给定条件,这意味着定义两个变量来保存表示上周开始和结束的日期对象。稍后在管道中查询您的集合时将需要此选项 您可以从管道步骤开始,该步骤将集合中的所有文档分组,并使用计算文档总数。您还可以使用十进制运算符根据日期范围计算条件和,以馈送 以下解释了上述方法:
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),带有时间戳的周
var today = new Date();
db.yourCollectionName.aggregate([{
$project: {
"tsYear": {$year: "$timeStamp"},
"tsWeek": {$week: "$timeStamp"},
"todYear": {$year: today},
"todWeek": {$week: today}
}
}, {
$project: {
cmpWeek: {$cmp: ['$tsWeek', {$add: [-1, '$todWeek']}]},
cmpYear: {$cmp: ['$tsYear', '$todYear']}
}
}, {
$match: {
cmpWeek: 0,
cmpYear: 0
}
}, {
$group: {
_id: "UsersCreated",
totalLastWeek: {$sum: 1}
}
}
])
上周创建的用户:周等于上一日历周的时间戳 在宣布今天的日期之后。我们可以在管道中使用聚合阶段,如下所示:
- 带有时间戳的当前年份的年份
- 当前周(-1),带有时间戳的周
var today = new Date();
db.yourCollectionName.aggregate([{
$project: {
"tsYear": {$year: "$timeStamp"},
"tsWeek": {$week: "$timeStamp"},
"todYear": {$year: today},
"todWeek": {$week: today}
}
}, {
$project: {
cmpWeek: {$cmp: ['$tsWeek', {$add: [-1, '$todWeek']}]},
cmpYear: {$cmp: ['$tsYear', '$todYear']}
}
}, {
$match: {
cmpWeek: 0,
cmpYear: 0
}
}, {
$group: {
_id: "UsersCreated",
totalLastWeek: {$sum: 1}
}
}
])
你能在帖子中添加示例文档和预期结果吗?我刚刚添加了示例文档。你能在帖子中添加示例文档和预期结果吗?我刚刚添加了示例文档