MongoDB聚合中包含零条目的返回组

MongoDB聚合中包含零条目的返回组,mongodb,Mongodb,所有的答案似乎都很陈旧,所以我将再次提出: 我正在尝试按日期对收藏进行分组和计数,如下所示: db.getCollection('mycollection').aggregate([ { $group : { _id :{ $dateToString: { format: "%Y-%m-%d", date: "$timestamp"} }, count: { $sum: 1 } } } ]) 即使是在大型集合上

所有的答案似乎都很陈旧,所以我将再次提出:

我正在尝试按日期对收藏进行分组和计数,如下所示:

db.getCollection('mycollection').aggregate([
  {
    $group : {
               _id :{ $dateToString: { format: "%Y-%m-%d", date: "$timestamp"} },
               count: { $sum: 1 }
    }
  }
])
即使是在大型集合上,它也非常有效,只是它不会返回零计数的日期。今天有什么最佳实践来实现这一点?总的来说,有没有办法做到这一点

当然,我总是可以创建一个日期数组,然后一个接一个地循环,但从性能上看,这似乎非常昂贵,所以一定有更好的方法,对吗


或者:将聚合与集合中从第一个到最后一个条目的所有日期的数组进行匹配,并添加不存在的日期?

看来,在MongoDB中仍然无法做到这一点,因此下面是我关于如何按天对集合进行分组的解决方案,对生成的文档进行计数,并重新构造输出,使其包含所有天数,包括计数为零的天数

从集合中获取数据:

db.getCollection('mycollection').aggregate([{
    $match : { 
       timestamp: {"$gte": new Date(2020, 1, 2), "$lt": new Date(2020, 2, 1)}}
   },
   {
    $group : {
       _id :{ $dateToString: { format: "%Y-%m-%d", date: "$timestamp"} },
      count: { $sum: 1 }
      }
}])
这将返回给定时间段(2020年2月)内计数大于零的所有天数(以下代码段中的mongo_返回) 要重新构造阵列,使其包含2月份的所有天数,可以执行以下操作:

//MONGODB结果
var mongo_返回=[
{
_id:“2020-02-02”,
计数:294.0
},
{
_id:“2020-02-16”,
计数:243.0
},
{
_id:“2020-02-18”,
计数:153.0
}
];
//将MONGODAYS插入数组
var mongoDays=mongo_return.map(函数(项){
返回项目。\u id;
});
//设定时间表
风险值开始=新日期(2020年1月1日);
var结束=新日期(2020年2月0日);
//在时间范围内生产所有天
对于(var d=开始;d b._id?1:0;
});

控制台日志(结果)因此,如果您的
时间戳
字段的值为2015年到2020年,您是否需要5年内所有缺失日期的0?事实上:是。我在这里简化了我的代码,并通过在$group前面放置$match来减少输出,但这并没有改变问题。有什么特别的原因吗?是的,使用
$match
应该会对你有很大帮助,否则在两个给定日期之间生成所有日期(几年)可能会非常大,我想说,即使你做了一年,如果通过mongo完成,也会变得很麻烦(因为你需要考虑一个月的天数,比如说YA的31,下一步添加代码> 0代码/代码>失踪日期。另外,你可能需要知道2020 FEB有29天-所以在查询中做所有这些都是非常棘手的):那么,你有没有解决零问题的方法?对于超过一百万个文档和大约三年的数据,上面的聚合只需要大约3秒钟,所以这显然不是我的问题。我没有任何想法,不知道如何获得feb2020有29天(而feb2019有28天)。因此,这种东西使你的简单聚合在完成超过3年后看起来很笨重。。