$суммировать строковые значения с $cond в массиве MongoDB

#mongodb

#mongodb

Вопрос:

Я пытаюсь получить $sum некоторые значения, соответствующие следующему условию.

Моя коллекция:

 {
    _id: 1,
    items: [ 
    {
        name: 'item1',
        status: 'On'
    },
    {
        name: 'item2',
        status: 'On'
    },
    {
        name: 'item3',
        status: 'Off'
    }]
}
 

Мне нужно, чтобы $sum все items , что имеет статус «Включено»

Это то, что я пытаюсь:

      {
        $addFields: {
            itemsOn: { "$sum": { "$cond": [{ if: { $eq: ["$items.status", 'On'] } }, { then: 1 }, { else: 0 }] } },
        }
    }
 

Но это не работает, какая-нибудь помощь? заранее спасибо

Ответ №1:

  • $filter для фильтрации элементов на основе условия, $size чтобы получить общее количество возвращенных элементов из фильтра,
 db.collection.aggregate([
  {
    $addFields: {
      itemOn: {
        $size: {
          $filter: {
            input: "$items",
            cond: { $eq: ["$this.status", "On"] }
          }
        }
      }
    }
  }
])
 

Игровая площадка


Второй вариант с использованием $reduce ,

  • $reduce чтобы повторить цикл items массива, проверьте условие, если статус совпадает, затем суммируйте со значением
 db.collection.aggregate([
  {
    $addFields: {
      itemOn: {
        $reduce: {
          input: "$items",
          initialValue: 0,
          in: {
            $cond: [
              { $eq: ["$this.status", "On"] },
              { $sum: ["$value", 1] },
              "$value"
            ]
          }
        }
      }
    }
  }
])
 

Игровая площадка

Комментарии:

1. Нравится этот подход, работает отлично, спасибо за ответ! Но я все еще проверяю свой код и действительно не понимаю, почему он не работает:/ что я делаю не так?

2. items — это массив, и для sum требуется перебирать элемент за элементом, используя такие операторы, как, $ map, $ reduce, $ filter и т. Д. Вы можете посмотреть на второй подход, такой как ваш