2016-12-06 66 views
3

我使用的NodeJS和MongoDB数据库猫鼬聚集GROUPBY,一年

我的文档是:

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

用户会给FROM日期,TODATE和频率在客户方在其频率值可其中0表示日,1表示周,2表示年。

在以上数据的基础上,我想生成报告

为前:如果用户给FROM日期= 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其他更好的方法也欢迎

编辑:我还希望文件的数量在用户ID上是唯一的

回答

2

C赫克在$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() 
+0

你能帮助我在上面的问题 – Sam

+0

我添加了一个例子,唯一的区别是,频率1它输出周数作为组键,而不是像“2016-12-01至2016-12-06”这样的字符串。希望能帮助到你! – Rudi

+0

感谢您的帮助!这件事我也可以实现与$ dayOfMonth和$ year ..但主要问题是与星期..我怎么能转换本周数量日期,因为我高于以上数据写入excel文件生成报告 – Sam