Mongodb - сгруппировать по значению и получить количество - PullRequest
1 голос
/ 11 марта 2020

У меня есть сводный запрос, который возвращает результат, подобный

    {
      count:1,
      status: 'FAILED',
      article_id: 1
    },
    {
      count:1,
      status: 'DELIVERED',
      article_id: 1
    }

Я хочу сгруппировать по article_id и получить счет на основе состояния, что-то вроде этого:

   {
      article_id:1,
      FAILED:1,
      DELIVERED:2
   }

Как мне это заархивировать? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 11 марта 2020

Другие ответы могут работать в принципе, однако они жестко ограничены статусами FAILED и DELIVERED.

Если вы хотите иметь универсальное c решение для произвольного статуса, вы можете использовать это:

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" } },
])

Пн go детская площадка

0 голосов
/ 11 марта 2020

Попробуйте этот код

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

mongoplayground

0 голосов
/ 11 марта 2020
 {
   $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 вернет общую длину массива. Вы можете получить размер $ в монго}

...