Mongodb-按值分组并获取计数

Mongodb-按值分组并获取计数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个聚合查询,它返回如下结果 { count:1, status: 'FAILED', article_id: 1 }, { count:1, status: 'DELIVERED', article_id: 1 } 我想根据文章编号分组,并根据状态获取计数,如下所示: { article_id:1, FAILED:1, DELIVERED:2

我有一个聚合查询,它返回如下结果

    {
      count:1,
      status: 'FAILED',
      article_id: 1
    },
    {
      count:1,
      status: 'DELIVERED',
      article_id: 1
    }
我想根据文章编号分组,并根据状态获取计数,如下所示:

   {
      article_id:1,
      FAILED:1,
      DELIVERED:2
   }
如何存档此文件? 提前谢谢

 {
   $group:{
     _id:"$_id",
     articleId:{$addToset:"$article_id"},
     failed:{$addToset:"$failed"},
     delivered:{$addToset:"$delivered"}

   }
 },
 { $addFields:{ 
    article_id:{$size:articleId},
    fail:{$size:"$faild"},
    deliver:{$size:"$faild"},
   }
在组中,$addToSet将返回数组,在addField中将返回数组的总长度。你可以在mongo搜索$size }

试试这段代码

 db.getCollection('artwork').aggregate([
  {
    $group: {
      _id: '$article_id',
      FAILED: {
        '$sum': {
          "$cond": [{ "$eq": ["$status", "FAILED"] }, 1, 0]
        }
      },
      DELIVERED: {
        '$sum': {
          "$cond": [{ "$eq": ["$status", "DELIVERED"] }, 1, 0]
        }
      }
    }
  }
])

其他答案原则上可能有效,但它们仅限于硬编码状态
失败
交付

如果您希望为任意状态提供通用解决方案,可以使用此解决方案:

db.collection.aggregate([
   { $set: { data: [{ k: "$status", v: "$count" }] } },
   {
      $replaceRoot: {
         newRoot: {
            $mergeObjects: [
               { $arrayToObject: "$data" }, { article_id: "$article_id" }
            ]
         }
      }
   },
   {
      $group: {
         _id: "$article_id",
         status: { $push: "$$ROOT" }
      }
   },
   { $set: { status: { $mergeObjects: ["$status"] } } },
   { $replaceRoot: { newRoot: "$status" } },
])

我认为您必须使用
{$sum:{…$count',0}}
而不是
{$sum:{…1,0}