【问题标题】:Mongoose aggregation groupby on day,week,year [duplicate]猫鼬聚合groupby在天,周,年[重复]
【发布时间】:2017-04-21 01:32:17
【问题描述】:

我正在使用 nodejs 和 mongodb 作为数据库

我的文件是:

{
    "_id": "58466d6a0b3f4d2e2fa22905",
    "updatedAt": "2016-12-06T07:48:58.435Z",
    "createdAt": "2017-12-06T07:48:58.435Z",
    "userId": "56d04e265a2100c72a311334",
    "__v": 0
  }

用户将在客户端给出fromDate,toDate和频率,其中频率值可以是0,1,2 其中 0 表示日,1 表示周,2 表示年。

根据以上数据我想生成报告

例如:如果用户给出 fromDate=2016-12-1 和 toDate=2016-12-6。

如果频率为 0,结果将是

{
  2016-12-01:{
    count:1
          }
  2016-12-02:{
      count:7   
        }
  2016-12-06:{
      count:8
      }
  }

如果频率为 1,结果将是

{
  2016-12-01 to 2016-12-06:{
    count:16
          }
  }

如果频率为 2,结果将是

{
  2016:{
    count:16
          }
  }

其中count是文档数

我是这样做的:

var aggregate = [{
        $match: {
            createdAt: {
                $gte: fromDate,
                $lt: toDate
            }
        }
    }, {
        $group: {
            // what should i will do here
            },
            count: {
                $sum: 1
            }
        }
    }]

    return LoginReportModel.aggregate(aggregate).exec();

或者任何人知道其他更好的方法,比如使用 lodash 也欢迎

已编辑:我还希望 userId 上的文档计数是唯一的

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    查看$dateToString上的文档

    你可以这样做:

    var frequency = 2
    
    var frequencyDateFormatMap = {
      0: '%Y-%m-%d',
      1: '%U',
      2: '%Y'
    }
    
    var frequencyDateFormat = frequencyDateFormatMap[frequency]
    
    var aggregate = [
      {$match: {
        createdAt: {
          $gte: fromDate,
          $lt: toDate
        }
      }},
      {$project: {
        frequency: {
          $dateToString: {
            format: frequencyDateFormat,
            date: '$createdAt'
          }
        }
      }},
      {$group: {
        _id: '$frequency',
        count: {
          $sum: 1
        }
      }}
    ]
    
    return LoginReportModel.aggregate(aggregate).exec()
    

    【讨论】:

    • 你能帮我解决上述问题吗
    • 我添加了一个示例,唯一的区别是对于频率 1,它输出周数作为组键,而不是像“2016-12-01 到 2016-12-06”这样的字符串。希望对您有所帮助!
    • 感谢您的帮助!这件事我也可以用 $dayOfMonth 和 $year 实现.. 但主要问题是星期.. 我如何将这个星期数转换为日期,因为我在 excel 文件中写入上述数据以生成报告跨度>
    • 还有不同的值依赖于 userId(Edited)
    猜你喜欢
    • 2015-12-23
    • 2015-08-04
    • 2015-05-19
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2023-02-25
    相关资源
    最近更新 更多