Задать вопрос

Как использовать несколько $sum в аггрегации MongoDB?

Привет.
Пример коллекции:

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2,  "status": "ok"}
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "status": "ok"}
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5,  "status": "ok"}
{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10,  "status": "ok"}
{ "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10,  "status": "error"}


Как в результирующем документе сгруппировать по "item", посчитать количество этих совпадений, также сгруппировать по "status" и тоже посчитать эти поля? Чтобы получилось вот так:

{ "_id" : {{ "item" : "abc", count: 2 }, {"status":[ "error": 0, "ok": 2 ]}}
{ "_id" : {{ "item" : "jkl", count: 1 }, {"status":[ "error": 0, "ok": 1 ]}}
{ "_id" : {{ "item" : "xyz", count: 2 }, {"status":[ "error": 1, "ok": 1 ]}}


Если группировать отдельно по каждому полю - можно посчитать всё, что необходимо. Но как сделать в рамках одного запроса - не понимаю. Возможно ли такое?
  • Вопрос задан
  • 194 просмотра
Подписаться 5 Средний Комментировать
Решения вопроса 1
@hunk3r Автор вопроса
В общем, получилось так (логика - идём с самого нижнего уровня вложенности, считаем его, пушим в следующий уровень, считаем и т.д.):

db.collection.aggregate({
  "$group": {
    _id: {
      item: "$item",
      status: "$status"
    },
    count: {
      $sum: 1
    }
  }
},
{
  "$group": {
    _id: {
      item: "$_id.item"
    },
    count: {
      $sum: "$count"
    },
    status: {
      "$push": {
        status: "$_id.status",
        count: "$count"
      }
    }
  }
})


615b0843647aa950563569.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы