Mongo聚合查询提取最近7天的数据(node.js)

时间:2014-11-06 19:21:43

标签: node.js mongodb mongoose aggregation-framework

我有一大堆数据,我试图从Mongo(节点js)中提取数据,以便渲染一些图形。

我需要从几千名用户那里获取最近7天的数据。每个用户的特定数据格式如下:

{
    "passedModules" : 
    [{
        "module" : ObjectId("53ea17dcac1d13a66fb6d14e"),
        "date" : ISODate("2014-09-17T00:00:00.000Z")
    }, 
    {
        "module" : ObjectId("53ec5c91af2792f1112554e8"),
        "date" : ISODate("2014-09-17T00:00:00.000Z")
    }, 
    {
        "module" : ObjectId("53ec5c5baf2792f1112554e6"),
        "date" : ISODate("2014-09-17T00:00:00.000Z")
    }]
}

目前我有一组非常混乱的查询正在运行,但我相信这可以完全与Mongo一起完成吗?

基本上,我需要以动态的方式将所有条目从7天前提取到现在。

是否有一种尝试和测试方式以这种方式处理动态日期,更具体地说是使用mongo中的聚合框架?聚合框架的原因是我需要在之后对这些进行分组。

非常感谢

2 个答案:

答案 0 :(得分:5)

此类查询的一般模式是:

// Compute the time 7 days ago to use in filtering the data
var d = new Date();
d.setDate(d.getDate()-7);

db.users.aggregate([
    // Only include the docs that have at least one passedModules element
    // that passes the filter.
    {$match: {'passedModules.date': {$gt: d}}},
    // Duplicate the docs, one per passedModules element
    {$unwind: '$passedModules'},
    // Filter again to remove the non-matching elements
    {$match: {'passedModules.date': {$gt: d}}}
])

答案 1 :(得分:0)

@JohnnyHK 已经有了很好的答案。但是,如果您使用的是查询工具(如 Robot3T 或 Metabase)并且没有创建和更改变量的编程访问权限,那么这里有另一种选择。

    {
        "$match": {
            "$expr":{
                "$gte":[
                    "$passedModules.date",
                    { $add: [new Date(), -604800000]}
                ]
            }
        }
    }

其中数字 604800000 只是以毫秒为单位的时间:1000*60*60*24*<Number of Days>

您也可以将其与周或月相关。


    {
        
        "$match": {
            "$expr":{
                "$eq":[
                    { $add:[ {$multiply:[1000, { $year: ["$passedModules.date"] }]}, { $week: ["$passedModules.date"] } ]},
                    { $add:[ {$multiply:[1000, { $year: [new Date()] }]}, { $week: [new Date()] } ]}
                ]
            }
        }
    },

希望它能帮助和我一样的人。