【问题标题】:Mongo aggregate query pulling out last 7 days worth of data (node.js)Mongo 聚合查询提取过去 7 天的数据(node.js)
【发布时间】:2021-03-10 18:18:54
【问题描述】:

我有大量数据,我正试图从 Mongo (node 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 中的聚合框架?聚合框架的原因是我需要在之后对这些进行分组。

非常感谢

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    此类查询的一般模式是:

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

    【讨论】:

      【解决方案2】:

      @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()] } ]}
                      ]
                  }
              }
          },
      
      

      希望它可以帮助与我在相同情况下的其他人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多