Всем привет! Подскажите, пожалуйста, можно ли в одном запросе обновить/вставить

элемент в массив?

Пробую с помощью позиционного оператора найти элемент в массиве и если он существует, то обновить его данные, в противном случае создать новый элемент.

Вот пример моего запроса: https://mongoplayground.net/p/LYlNArEw_zJ
У меня есть элемент с полями country=UK и currency=EUR, я хочу попытаться вставить в массив prices ещё один объект с полями country=UK и currency=GBP, но почему-то операция insert не срабатывает. Видимо позиционный оператор позволяет только найти элемент, но не вставляет сам элемент в массив?

11 ответов

29 просмотров

Как в nodejs функцию составляешь и вставляешь туда уже интересующие запросы

Tim- Автор вопроса
Нуриддин Фахритдинов
Как в nodejs функцию составляешь и вставляешь туда...

Имеете ввиду, что это можно сделать только через aggregation?

Tim
Имеете ввиду, что это можно сделать только через a...

Так я не знаю точно возможно ли, у вас есть выход в варианте: контекст функции в которой исполняются сразу 2 или более запроса одновременно)

Tim- Автор вопроса
Нуриддин Фахритдинов
Так я не знаю точно возможно ли, у вас есть выход ...

Хотелось бы иметь на выходе как можно более лаконичный запрос, чтоб потом не сложно было разобраться, что там происходит) С update всё выглядит довольно просто, только upsert=true не отрабатывает так, как мне хотелось бы

апсерт он про добавление нового документа, если вдруг не нашелся искомый. В вашем случае можно попробовать на update with aggregation сделать. Полез реализовывать и прям закопался, проще уж вытащить док, изменит ьи полностью новый массив записать

Nick
апсерт он про добавление нового документа, если вд...

для истории 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 }] }

Tim- Автор вопроса
Nick
апсерт он про добавление нового документа, если вд...

Спасибо за ответ. Хотелось бы все таки попробовать реализовать через aggregation. У меня очень много данных будет, мне как можно меньшим количеством запросов к БД надо постараться сделать это

Tim
Спасибо за ответ. Хотелось бы все таки попробовать...

сложность составления запроса вам не даст никакого профита, а уж про то как легко в нем накасячить или доработать для чего еще я вообще молчу

если действие не про апдейт а подходит полная замена внутри массива, то чуть проще https://stackoverflow.com/a/75439766

Tim- Автор вопроса
Nick
если действие не про апдейт а подходит полная заме...

Не, как раз про апдейт, спасибо. Буду думать ещё, может в таком случае сделать легче просто плоскую модель данных. Из минусов то, что будет несколько документов с одним и тем же product_id, но зато операции апсерта будут довольно таки примитивными

Похожие вопросы

Обсуждают сегодня

Кто знает как подружить Gstreamer с OpenCV? Вот такой пайплайн я шлю с гстримера но OpenCV + python у меня никак не получается его воспроизвести "gst-launch-1.0 nvarguscameras...
Artem
3
Приветствую. Есть N видео объектов (фильмы). Часть полной длины просмотра а часть короткие ( обрезаны титры). Задача найти идентичные фильмы. Я не в курсе, есть ли аналог шаз...
Nikolay Chudinov
4
Я колись ставив гуглу антиспам 3.0, може і норм, але мені не дуже зайшло. Теж думав тиждень, що його і куди. Зупинився на трех варіантах відразу всі три і включив 1. Перевір...
𝓔𝓾𝓰𝓮𝓷𝓮𝓥 J
2
Это везде так работает, или еще колдовать нужно?)
Квадрат Гипотенузы
6
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Всем привет! Есть камеры для наблюдения с встроенной видеоаналитикой (детектор лиц, например). Как я понял, все вычисления и анализ происходят на самом железе камеры, и пр...
Артур 🌞 Сапрыкин
1
Карта сайта