Anonymous
щас если сработает покажу как сделал
Anonymous
пробовал вот так, но он почему-то не хочет добавлять +1 к количеству
Anonymous
или там значения реадонли
Nick
user = User.findOne() user.cart.find(el=>id==user.cart.id); //и тут уже смотреть нашел он или нет
да тут все верно, если не нашли, то создаем корзину, в корзине создаем массив и добавляем первый продукт, если корзина уже есть, то ищем в коде есть ли уже нужный продукт в списке и инкрементим
Anonymous
cart.products.$inc.amount = 1; await cart.save();
Anonymous
вот так?
Anonymous
или же мне опять писать updateOne
Nick
cart.products.$inc.amount = 1; await cart.save();
нет, $inc используется внутри $set в апдейте
Nick
да не работает. Я пытаюсь не писать два одинаковых метода, которые отличаются только match
соберите пайп вручную собрав массив из стейджей и просто добавляйте или не добавляйте стейдж $match по вашему условию
Nick
let pipe = []; if(exists){ pipe.push({"$match": {"vvv": exists}}); }
Сергей
Ребят, подскажите как организовать такую штуку У меня есть модель пользователя, храню в ней данные связанные с проектом Но личные данные пользователя хранятся в другой базе - sql Я хочу получать все данные разом Что бы был один метод для получения объект с данными пользователя Могу ли я поместить запросы sql в метод модели? Или стоит разделить в отдельные сущьности?
Anonymous
почему он мне пишет что дублируются ключи
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
то есть даже на вложенные объекты
Nick
то есть даже на вложенные объекты
нет, только на сам документ
Anonymous
как ему сказать, что если нет товара такого в корзине, то создай его
Anonymous
инкрементирование работает
Александр
да
let pipe = [group({ ^ ReferenceError: group is not defined
Александр
да
не пойму, как пайп написать правильно
Nick
не пойму, как пайп написать правильно
тут к сожалению отправлю в гугл, потому как кроме собрать просто пайп для нативной монги в json виде другого не использовал, как это делается моем примере выше
Anonymous
@yatoba что деллает $ между полями?
Anonymous
products.$.product
Nick
указыает на позицию (индекс) подходящего элемента
Anonymous
то есть массив пустой
Nick
а если индекса нет?
на первый подходящий под запрос, но в вашем случае это не поможет. Способа сделать в один запрос вставку/обнолвение вложенного дока в массиве нет
VSH
подскажите как сделать populate в populate
Anonymous
populate({path: "posts", populate: {path: "_postId", populate: {...}}})
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
тогда реджексы
Cepmol
Да
Cepmol
?
Cepmol
Что такое реджексы?
Anonymous
find({name: {$regex: val, options: 'i'}})
Anonymous
мог ошибится в синтаксисе
Anonymous
i это чтоб искала в не зависимости от регистра
Cepmol
Понял куда копать, спасибо!
Anonymous
А как можно инкрементировать значений во вложенном объекте, без $inc
Anonymous
без $inc потому что валидация тогда не проходит
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, []]