Поскольку вы можете выполнить update-with-an-aggregation-pipeline в .update()
операциях, начиная с версии MongoDB> = 4.2
, попробуйте следующие запросы:
Query 1: Этот запрос воссоздает поле total_quantity
путем вычитания locations.quantity
конкретного удаляемого элемента из существующего total_quantity
. Также повторно создает массив locations
без элемента, который необходимо удалить.
db.collection.updateMany({'locations.id': 'loc1'},
[
{ $addFields: { total_quantity: { $subtract: [ "$total_quantity", { $arrayElemAt: [ "$locations.quantity", { $indexOfArray: [ "$locations.id", "loc1" ] } ] } ] } } },
{ $addFields: { locations: { $filter: { input: "$locations", cond: { $ne: [ "$$this.id", "loc1" ] } } } } }
]
)
Тест: Тестовый конвейер агрегирования здесь: mongoplayground
Запрос 2:
Этот запрос сначала повторно создает массив locations
без элемента, который необходимо удалить, а затем выполняет итерацию по оставшемуся массиву locations.quantity
, чтобы суммировать все quantity
значения всех элементов в массиве locations
для создания поля total_quantity
.
db.collection.updateMany({'locations.id': 'loc1'},
[
{ $addFields: { locations: { $filter: { input: "$locations", cond: { $ne: [ "$$this.id", "loc1" ] } } } } },
{ $addFields: { total_quantity: { $reduce: { input: "$locations.quantity", initialValue: 0, in: { $add: [ "$$value", "$$this" ] } } } } }
]
)
Тест: Тестовый конвейер агрегирования здесь: mongoplayground
Примечание: Если вы обнаружите какие-либо проблемы при выполнении этих запросов с помощью .updateMany()
, попробуйте .update()
с опцией { multi : true }
.