MongoDB在一个查询记录中找到上周创建的记录

时间:2016-09-29 20:05:23

标签: mongodb mongodb-query aggregation-framework

我正在尝试构建一个返回用户总数和上周创建的用户数的查询。 这里有一个名为 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天前创建的所有用户的另一个数量。

2 个答案:

答案 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)

上周创建的用户:timeStamps,其中一周等于上一个日历周。 在宣布今天的日期之后。我们可以在管道中使用聚合阶段,如下所示: 项目获取时间戳的年份和星期,以及当前年份和星期。 项目再次进行比较: 当年与时间戳的年份。 当前周(-1)与时间戳的一周。 匹配比较字段为0,因为0表示相等。 最后组合得到上周这样的时间戳。 在mongo shell上执行: var today = new Date(); db.yourCollectionName.aggregate([{     $ project:{         “tsYear”:{$ year:“$ timeStamp”},         “tsWeek”:{$ week:“$ timeStamp”},         “todYear”:{$ year:today},         “todWeek”:{$周:今天}     } },{     $ project:{         cmpWeek:{$ cmp:['$ tsWeek',{$ add:[ - 1,'$ todWeek']}]},         cmpYear:{$ cmp:['$ tsYear','$ todYear']}     } },{     $ match:{         cmpWeek:0,         cmpYear:0     } },{     $ group:{         _id:“UsersCreated”,         totalLastWeek:{$ sum:1}     } } ])