Я пытаюсь обновить поле (totalPrice) в моем документе (ах) на основе значения во вложенном, вложенном массиве (addOns> получить соответствующий массив из x числа массивов> получить int в соответствующем массиве [всегда в pos 2]).
Вот пример документа с двумя массивами, вложенными в надстройки:
{
"_id": ObjectID('.....'),
"addOns": [
["appleId", "Apples", 2],
["bananaID", "Bananas", 1]
],
"totalPrice": 5.7
}
Допустим, цена бананов увеличилась на 20 центов, поэтому мне нужно искать все документы, в дополнении которых есть бананы, а затем увеличить общую стоимость этих документов в зависимости от количества купленных бананов. Я планирую использовать запрос updateMany () с конвейером агрегирования, который должен примерно выглядеть как в примере ниже. ??? должно быть количество купленных бананов, но я не знаю, как go получить это значение. До сих пор я думал об использовании $ unwind, $ filter и $ arrayElemAt, но не знаю, как использовать их вместе. Был бы признателен за любую помощь!
db.collection('orders').updateMany(
{ $elemMatch: { $elemMatch: { $in: ['bananaID'] } } },
[
{ $set: {'totalPrice': { $add: ['$totalPrice', { $multiply: [{$toDecimal: '0.2'}, ???] } ] } } }
]
Я не совсем уверен, какая у меня версия mon go, но я знаю, что могу использовать конвейер агрегации, потому что у меня есть другие вызовы updateMany (), которые также используйте конвейер без каких-либо проблем, поэтому он должен быть (версия> = 4.2).
** Edit : подумал об этом для ???, шаг фильтра, похоже, работает несколько поскольку документы обновляются, но вместо обновленной цены значение равно нулю. Не уверен, почему
- Отфильтруйте массив '$ addOns', чтобы вернуть соответствующий вложенный массив.
- В качестве условия используйте $ eq, чтобы проверить, находится ли элемент в [0] (' $$ this.0 ') соответствует строке' bananaID ', и если она возвращает этот вложенный массив.
- Получить массив, возвращенный с шага 1, используя $ arrayElemAt и позицию [0].
- Снова используйте $ arrayElemAt в массиве из шага 3 с positon [2], поскольку это индекс элемента количества
{ $arrayElemAt: [{ $arrayElemAt: [ { $filter: { input: "$addOns", as:'this', cond: { $eq: ['$$this.0', 'bananaID'] } } } , 0 ] }, 2 ] }