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

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

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

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

11 ответов

76 просмотров

Как в 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, но зато операции апсерта будут довольно таки примитивными

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

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

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
1. https://www.kaggle.com/code/ahmadrezagholami2001/housing-estimation-linear-regression 2. https://www.kaggle.com/code/ahmadrezagholami2001/uncovering-quality-in-wines-logis...
Ahmadreza
1
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта