Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB在一个查询中查找上周和以后创建的记录_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

MongoDB在一个查询中查找上周和以后创建的记录

MongoDB在一个查询中查找上周和以后创建的记录,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试构建一个查询,返回用户总数和上周创建的用户数。 有一个名为timeStamp的字段,表示创建日期 我正试图通过聚合来实现这一点,我想我应该首先按照时间戳对所有用户进行分组,但我不知道我能做些什么来实现这一点 编辑: 用户文档示例: { "_id" : ObjectId("57be35d6fab7762415376b1b"), "provider" : "local", "isValidAccount" : true, "isActive" : true,

我正在尝试构建一个查询,返回用户总数和上周创建的用户数。 有一个名为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天前创建的所有用户的计数和另一个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),带有时间戳的周
  • 将比较字段与0匹配,因为0表示相等
  • 最后一组获得上周此类时间戳的总数
  • 在mongo shell上执行以下操作:

    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),带有时间戳的周
  • 将比较字段与0匹配,因为0表示相等
  • 最后一组获得上周此类时间戳的总数
  • 在mongo shell上执行以下操作:

    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}
        }
    }
    ])
    

    你能在帖子中添加示例文档和预期结果吗?我刚刚添加了示例文档。你能在帖子中添加示例文档和预期结果吗?我刚刚添加了示例文档