#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 и т. Д. Вы можете посмотреть на второй подход, такой как ваш