Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb聚合(月)查询集“;“缺少字段”;归零_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb聚合(月)查询集“;“缺少字段”;归零

Mongodb聚合(月)查询集“;“缺少字段”;归零,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个聚合查询,它将所有文档按月份分组一年 db.collection.aggregate([ { $match: { dos: { $gte: startOfYear(new Date()), $lte: endOfYear(new Date()) }, }, }, { $group: { _id: { $month: "$dos" }, count: {

我有一个聚合查询,它将所有文档按月份分组一年

db.collection.aggregate([
  {
    $match: {
      dos: { $gte: startOfYear(new Date()), $lte: endOfYear(new Date()) },
     },
  },
  {
    $group: {
      _id: {
        $month: "$dos"
      },
      count: {
        $sum: 1
      }, 
    },
  },
  {
    $project: {
      month: "$_id",
      count: true,
      _id: false,
      
    },
  },
  {
    $sort: {
      month: 1,
      
    }, 
  },
])
这将导致3个项目(1月、2月、3月)。每个人都有一份当月完成的文件

[
  {
    "count": 1,
    "month": 1
  },
  {
    "count": 1,
    "month": 2
  },
  {
    "count": 1,
    "month": 3
  }
]
我想要的是添加缺少的字段,这些字段是4月到12月,带有{count:0 month:4}、{count:0,month:5}等等

[
  {
    "count": 1,
    "month": 1
  },
  {
    "count": 1,
    "month": 2
  },
  {
    "count": 1,
    "month": 3
  },
  {
    "count": 0,
    "month": 4
  },
  {
    "count": 0,
    "month": 5
  },
  ...,
  { 
    "count": 0,
    "month": 12,
  }
]
这可能吗

你可以在这里玩代码。
这是可能的,因为输出的长度总是固定的。因此,我们的想法是生成一个长度为12的数组,然后填充那些数据为空的月份。所以试试这个:

解决方案#1

db.calendar.aggregate([
//把你的比赛舞台放在这里。
{
$group:{
_id:{$month:$dos},
计数:{$sum:1}
},
},
{
$group:{
_id:null,
数组:{$push:$$ROOT}
}
},
{
$addFields:{
数组:{
$map:{
输入:[1,2,3,4,5,6,7,8,9,10,11,12],
如:“月”,
在:{
$cond:{
if:{$in:[“$$month”,“$array.\u id”]},
然后:{
$arrayElemAt:[
“$array”,
{$indexOfArray:[“$array.\u id”,“$$month”]}
]
},
其他:{
_id:“$$month”,
计数:0
}
}
}
}
}
}
},
{$unwind:“$array”},
{
$sort:{“array.\u id”:1}
},
{
$项目:{
_id:0,
计数:“$array.count”,
月份:“$array.\u id”
}
}
]);
解决方案#2:与第一个相比效率更高

db.calendar.aggregate([
//把你的比赛舞台放在这里。
{
$group:{
_id:{$month:$dos},
计数:{$sum:1}
},
},
{
$group:{
_id:null,
数组:{$push:$$ROOT}
}
},
{
$addFields:{
数组:{
$map:{
输入:[1,2,3,4,5,6,7,8,9,10,11,12],
如:“月”,
在:{
$let:{
变量:{
索引:{$indexOfArray:[“$array.\u id”,“$$month”]}
},
在:{
$cond:[
{$gt:[“$$index”,-1]},
{$arrayElemAt:[“$array”,“$$index”]},
{u id:“$$month”,计数:0}
]
}
}
}
}
}
}
},
{$unwind:“$array”},
{
$sort:{“array.\u id”:1}
},
{
$项目:{
_id:0,
计数:“$array.count”,
月份:“$array.\u id”
}
}
]);
输出:

/*1*/
{
“计数”:2,
“月份”:1
},
/* 2 */
{
“计数”:2,
“月份”:2
},
/* 3 */
{
“计数”:1,
“月份”:3
},
/* 4 */
{
“计数”:0,
“月份”:4
},
/* 5 */
{
“计数”:0,
“月份”:5
},
/* 6 */
{
“计数”:0,
“月份”:6
},
/* 7 */
{
“计数”:0,
“月份”:7
},
/* 8 */
{
“计数”:1,
“月份”:8
},
/* 9 */
{
“计数”:0,
“月份”:9
},
/* 10 */
{
“计数”:1,
“月份”:10
},
/* 11 */
{
“计数”:0,
“月份”:11
},
/* 12 */
{
“计数”:0,
“月份”:12
}
测试数据:

/*1创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c271”),
“dos”:ISODate(“2021-01-15T00:00:00.000+05:30”)
},
/*创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c272”),
“dos”:ISODate(“2021-03-03T00:00:00.000+05:30”)
},
/*创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c273”),
“dos”:ISODate(“2021-02-14T00:00:00.000+05:30”)
},
/*创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c274”),
“dos”:ISODate(“2021-01-26T00:00:00.000+05:30”)
},
/*创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c275”),
“dos”:ISODate(“2021-02-28:00:00.000+05:30”)
},
/*6创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c276”),
“dos”:ISODate(“2021-08-15T00:00:00.000+05:30”)
},
/*7创建日期:2021年3月17日,下午7:27:28*/
{
“_id”:ObjectId(“60520ac8479cd440a079c277”),
“dos”:ISODate(“2021-10-02T00:00:00.000+05:30”)
}

在聚合查询中没有直接的方法来实现这一点,所以在查询结果之后。您可以使用客户端语言来完成。谢谢,我目前正在使用for循环为不存在的数据填充0。。