элемент в массив?
Пробую с помощью позиционного оператора найти элемент в массиве и если он существует, то обновить его данные, в противном случае создать новый элемент.
Вот пример моего запроса: https://mongoplayground.net/p/LYlNArEw_zJ
У меня есть элемент с полями country=UK и currency=EUR, я хочу попытаться вставить в массив prices ещё один объект с полями country=UK и currency=GBP, но почему-то операция insert не срабатывает. Видимо позиционный оператор позволяет только найти элемент, но не вставляет сам элемент в массив?
Как в nodejs функцию составляешь и вставляешь туда уже интересующие запросы
Имеете ввиду, что это можно сделать только через aggregation?
Так я не знаю точно возможно ли, у вас есть выход в варианте: контекст функции в которой исполняются сразу 2 или более запроса одновременно)
Хотелось бы иметь на выходе как можно более лаконичный запрос, чтоб потом не сложно было разобраться, что там происходит) С update всё выглядит довольно просто, только upsert=true не отрабатывает так, как мне хотелось бы
апсерт он про добавление нового документа, если вдруг не нашелся искомый. В вашем случае можно попробовать на update with aggregation сделать. Полез реализовывать и прям закопался, проще уж вытащить док, изменит ьи полностью новый массив записать
для истории db.getCollection('t_1').updateOne({ product_id: "TEST_PRODUCT" }, [{ $set: { prices: { $cond: { if: { $gt: [{ $reduce: { input: "$prices", initialValue: 0, in: { $add: [ "$$value", { $cond: { if: {$and: [{ $eq: ["$$this.country", "UK"] }, { $eq: ["$$this.currency", "GBP"] } ]}, then: 1, else: 0 } } ]} } }, 0 ] }, then: { $map: { input: "$prices", in: { $setField: { field: "value", input: "$$this", value: { $cond: { if: { $and: [{ $eq: ["$$this.country", "UK"] }, { $eq: ["$$this.currency", "GBP"] } ] }, then: 150, else: "$$this.value" } } } } } }, else: { $concatArrays: [ "$prices", [{ "country": "UK", "currency": "GBP", "value": 150 }] ] } } } } } ]); для дока вида: { "product_id" : "TEST_PRODUCT", "prices" : [ { "country" : "RU", "currency" : "RUB", "value" : 120 },{ "country" : "UK", "currency" : "EUR", "value" : 140 }] }
Спасибо за ответ. Хотелось бы все таки попробовать реализовать через aggregation. У меня очень много данных будет, мне как можно меньшим количеством запросов к БД надо постараться сделать это
сложность составления запроса вам не даст никакого профита, а уж про то как легко в нем накасячить или доработать для чего еще я вообще молчу
если действие не про апдейт а подходит полная замена внутри массива, то чуть проще https://stackoverflow.com/a/75439766
Не, как раз про апдейт, спасибо. Буду думать ещё, может в таком случае сделать легче просто плоскую модель данных. Из минусов то, что будет несколько документов с одним и тем же product_id, но зато операции апсерта будут довольно таки примитивными
Обсуждают сегодня