按日、周、年分组的Mongoose聚合

3

我正在使用Node.js和MongoDB进行数据库操作。

我的文档如下:

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

用户将在客户端提供fromDate、toDate和frequency,其中frequency值可以为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
          }
  }

文档计数的意思是指文件数量。

我已经这样做了:

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计算文档数量时是唯一的

1个回答

4

请查看关于$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()

你能帮我解决上述问题吗? - Simran
我添加了一个示例,唯一的区别是对于频率1,它输出周数作为组键,而不是像“2016-12-01到2016-12-06”这样的字符串。希望能有所帮助! - Rudi
感谢帮助!我也可以用$dayOfMonth和$year来实现这个。但是主要问题在于周数,我要如何将这个周数转换为上述提到的日期呢?因为我需要将上述数据写入Excel文件以生成报告。 - Simran
还需要在userId上统计不同值的数量。 - Simran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接