Anonymous
щас если сработает покажу как сделал
Anonymous
Anonymous
пробовал вот так, но он почему-то не хочет добавлять +1 к количеству
Anonymous
или там значения реадонли
Nick
Anonymous
cart.products.$inc.amount = 1;
await cart.save();
Anonymous
вот так?
Anonymous
или же мне опять писать updateOne
Nick
Nick
Александр
Nick
let pipe = [];
if(exists){
pipe.push({"$match": {"vvv": exists}});
}
Сергей
Ребят, подскажите как организовать такую штуку
У меня есть модель пользователя, храню в ней данные связанные с проектом
Но личные данные пользователя хранятся в другой базе - sql
Я хочу получать все данные разом
Что бы был один метод для получения объект с данными пользователя
Могу ли я поместить запросы sql в метод модели?
Или стоит разделить в отдельные сущьности?
Anonymous
почему он мне пишет что дублируются ключи
Nick
Anonymous
MongoServerError: E11000 duplicate key error collection: deliverycx.carts
index: _id_ dup key: { _id: ObjectId('6154526aaadac5537dae3cc4') }
Anonymous
блин я запарился
Anonymous
убейте
Anonymous
то что ты выше предлагал, оно работает не так как надо
Anonymous
слишком костыльно получается
Nick
так происходит потому что в услвоии выборки есть еще продукт и связку id+product не находит, поэтому пытается сделать инсерт, т.к. указана опуция upsert.
А при инсерте использует уже указанный _id для создания и как следствие создает док с тем же _id который само собой попадает на индекс уникальности
Anonymous
Anonymous
я думал апсерт работает на изменяемую запись
Anonymous
то есть даже на вложенные объекты
Nick
Anonymous
как ему сказать, что если нет товара такого в корзине, то создай его
Anonymous
инкрементирование работает
Александр
Nick
Александр
да
let pipe = [group({
^
ReferenceError: group is not defined
Александр
да
не пойму, как пайп написать правильно
Nick
не пойму, как пайп написать правильно
тут к сожалению отправлю в гугл, потому как кроме собрать просто пайп для нативной монги в json виде другого не использовал, как это делается моем примере выше
Anonymous
@yatoba что деллает $ между полями?
Anonymous
products.$.product
Nick
указыает на позицию (индекс) подходящего элемента
Александр
Anonymous
Anonymous
то есть массив пустой
Nick
а если индекса нет?
на первый подходящий под запрос, но в вашем случае это не поможет. Способа сделать в один запрос вставку/обнолвение вложенного дока в массиве нет
VSH
подскажите как сделать populate в populate
Anonymous
populate({path: "posts", populate: {path: "_postId", populate: {...}}})
VSH
Anonymous
Nick
Anonymous
ааа
Anonymous
тогда я могу быть спокоен получается
Nick
да
Nick
тогда я могу быть спокоен получается
ну если прям серьезно докапываться, то тут парамоментов есть:
1. race condition на работе с базой между запросами, т.к используется не cart.save() и монгус может потерять изменения истории в другом месте и перезаписать изменения. Если ваш проект допускает изменение сущности cart из разных мест, то это хоть мало но вероятно
2. $addToSet сверяет полное совпадение объектов, а значит дороже $push. В данном коде пользы от $addToSet не будет, т.к. мы уже разрулили проблему пересечения и стоит исользовать $push
3. $addToSet опять же изза того, что проверяет совпадение полностью объектов (поле amount отсутствует и тем более не установлено в 1 при вставке) теоретически добавит дубль по продукту в случае рейс кондишна, обозначенного в первом пункте, при двойном вызове этого метода и небольшом невезении - это еще один поинт для использования $push и точно знать что дубль может теоретически быть
Anonymous
С нескольких мест это как
Anonymous
Все запросы с магазина идут то есть один путь
Nick
это например в карточке есть ендпоинт для добавления продуктов, а есть выбор адреса доставки или может еще какие атрибуты уровня заказа и они обновляются через другой эндпоинт вызывая друго метод, но самое главное если там меняется Cart. И если там идет работа с по нормальному с монгусом через find-save, то монгус може перетереть изменения, которые сделались сдесь через составление update запроса. Хоть пример сейчас выглядит притянутым, т.к реально маловероятна, но это глобальная проблема, которая показывает что смешивают разные подходы в работе
Anonymous
понял, спасибо
Cepmol
Здравствуйте, подскажите как отобрать документы по определённому ключу?
Anonymous
то есть?
fλüggåɘnk∂€čhiœßøλ∫ên
find( { "name": "Hopper" } ) ?
Cepmol
Допустим все с ключем name
Anonymous
ну так если ключа name нет, то он и не вкючит его, так как искать не по чему
Cepmol
В name в разных записях разные значения
Cepmol
Хотелось бы перебрать все записи в которых есть name: val
Anonymous
Anonymous
тебе скинули уже
Anonymous
или ты хочешь найти вхождения
Anonymous
тогда реджексы
Cepmol
Да
Cepmol
?
Cepmol
Что такое реджексы?
Anonymous
find({name: {$regex: val, options: 'i'}})
Anonymous
мог ошибится в синтаксисе
Anonymous
i это чтоб искала в не зависимости от регистра
Cepmol
Понял куда копать, спасибо!
Anonymous
А как можно инкрементировать значений во вложенном объекте, без $inc
Anonymous
без $inc потому что валидация тогда не проходит
Nick
Anonymous
Anonymous
я про эту
Anonymous
как бы на фронте это блочится, но мало лли кто-то умный через проогу будут отправлять
yopp
я сделал, но то как ты не советовал, в чем плохо делать так?
если хотите, вы можете сделать это в одном запросе через update pipeline
https://docs.mongodb.com/v5.0/tutorial/update-documents-with-aggregation-pipeline/
в $addFields сначала сделайте $map, внутри которого $cond на инкремент нужного вам поля ($map input: “$product, in: { $cond if: $thid.id eq <id>, then $inc $this.amount else $this)
после чего ещё раз сделайте $addFields но в этот раз с помощью $concatArrays попробуйте добавить элемент, если его нет:
$concatArray: $cond: if: $size $filter (cond: $this.id eq <id>) eq 0, then: [$products, {new_product}], else: [$products, []]
Anonymous
если хотите, вы можете сделать это в одном запросе через update pipeline
https://docs.mongodb.com/v5.0/tutorial/update-documents-with-aggregation-pipeline/
в $addFields сначала сделайте $map, внутри которого $cond на инкремент нужного вам поля ($map input: “$product, in: { $cond if: $thid.id eq <id>, then $inc $this.amount else $this)
после чего ещё раз сделайте $addFields но в этот раз с помощью $concatArrays попробуйте добавить элемент, если его нет:
$concatArray: $cond: if: $size $filter (cond: $this.id eq <id>) eq 0, then: [$products, {new_product}], else: [$products, []]
да я видел такое решение, но оно достаточно громоздкое получается и плохо читаемое, хотя мб для меня так как я новичек