MongoDB - 从日期起每 7 天聚合 $group

标签 mongodb mongodb-query aggregation-framework

假设集合中有任意数量的具有以下结构的文档:

{ 
    "_id" : "1", 
    "totalUsers" : NumberInt(10000), 
    "iosUsers" : NumberInt(5000), 
    "androidUsers" : NumberInt(5000), 
    "creationTime" : ISODate("2017-12-04T06:14:21.529+0000")
},
{ 
    "_id" : "2", 
    "totalUsers" : NumberInt(12000), 
    "iosUsers" : NumberInt(6000), 
    "androidUsers" : NumberInt(6000), 
    "creationTime" : ISODate("2017-12-04T06:14:21.529+0000")
},
{ 
    "_id" : "3", 
    "totalUsers" : NumberInt(14000), 
    "iosUsers" : NumberInt(7000), 
    "androidUsers" : NumberInt(7000), 
    "creationTime" : ISODate("2017-12-04T06:14:21.529+0000")
}

并且想要编写一个返回两个给定日期(即:startDateendDate)之间的结果的查询,然后每 7 天对结果进行分组:

db.collection.aggregate(
  { $match: {$gte: startDate, $lte: endDate } },
  { $group: { _id: { --- every seven days from endDate --- } }
)

我该怎么做?

最佳答案

首先获取边界

var boundries = [];
vat sd= ISODate("2017-10-18T20:41:33.602+0000"),ed=ISODate("2017-11-22T12:41:36.348+0000");
boundries.push(sd);

var i = sd;

while(i<=ed){
    //push ISODate(i + 7 days) in boundries
}

//also push ISODate(ed+1day) because upper bound is exclusive

//use $bucket aggregation
db.collection.aggregate({$match:{creationTime:{$gte:stDate,$lte:endDate}}},{
$bucket:{
    groupBy: "$creationTime", 
    boundaries:boundries ,
}

})

关于MongoDB - 从日期起每 7 天聚合 $group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47547151/

相关文章:

javascript - 在 Node JS 中缓冲流中的数据以执行批量插入

mysql - 如何在nodejs中切换mysql和mongodb

mongodb - 在额外的 MongoDB 字段中保存数组的长度

mongodb - 使用 mongoDB 将嵌入式文档与父字段进行比较

mongodb - 如何在 MongoDB 中自定义 $group 输出?

node.js - MongoDB 聚合管道查询

java - 在 Spring Data TypedAggregation 上指定索引

Node.js MongoDB Find 与投影以排除 _id 仍然返回它

mongodb - Rocketchat 连接以保护 MongoDB

node.js - 蒙哥错误: The dollar ($) prefixed field '$push' in '$push' is not valid for storage