Nichita
а зачем оптимизировать? скажем так, что именно сейчас не устраивает
то что некоторые запросы крашатся и пользователь остается без ответа после фильтрации
Nichita
а причина того что они крашатся?
очень долгий ответ, фронт же ждет минуту, а в базе ищет очень долго
Nick
очень долгий ответ, фронт же ждет минуту, а в базе ищет очень долго
отлично, определеились что ничего не крашится, а таймауты не выдерживаются. Теперь можно уже к запросам переходить
Nick
ну я понимаю, некоторые запросы вызывают не тот индекс, тем самым отрабатывает очень долго
тот или не тот решает планировщик монги на сонове статистики и плана выполнения запроса. Наверняка запрос либо возвращает много данных, либо после применения индекса который вы думаете будет еще куча обращений на диски и дешевле использовать другой план выполнения
Nichita
классика, только напишешь о проблеме, сразу заработает… Но я найду запросы которые долго отвечают! такой вопрос, нормально ли такое количество индексов для 10млн?
Nichita
filter { $and: [ {region: "FR"}, {"variations.variation_details.warehouse": {'$in': ['ES']}}, {'site_name': {'$in': ['amazon', 'aliexpress']}}, {'variations.variation_details': {'$elemMatch': {'price': {'$lte': 100.0, '$gte': 30.0}}}}, {'categories.category_id.$id': ObjectId('6169735494f2b1708dccda2d')}, {'is_deleted': {'$in': [false, null]}}, ] } sort {"product_details.min_shipping_time": -1}
Nichita
вот такой запрос
Nichita
Тайм-аут
Nick
filter { $and: [ {region: "FR"}, {"variations.variation_details.warehouse": {'$in': ['ES']}}, {'site_name': {'$in': ['amazon', 'aliexpress']}}, {'variations.variation_details': {'$elemMatch': {'price': {'$lte': 100.0, '$gte': 30.0}}}}, {'categories.category_id.$id': ObjectId('6169735494f2b1708dccda2d')}, {'is_deleted': {'$in': [false, null]}}, ] } sort {"product_details.min_shipping_time": -1}
Наверняка выборка очень большая сама по себе и даже при наличии индексов вопрос в производительности сервера встает. Выполните вручную данный запрос с explain("executionStats") и посмотрите сколько будет возвращено данных.
Nick
классика, только напишешь о проблеме, сразу заработает… Но я найду запросы которые долго отвечают! такой вопрос, нормально ли такое количество индексов для 10млн?
можете посмотреть используемоесть индексов через $indexStats https://www.mongodb.com/docs/manual/tutorial/measure-index-use/, возможно какието бесполезны смотреть на accesses.ops
Hannibal
Занимаюсь фронтом, так сложилось, что в одном проекте приходится полностью брать на себя бэк, у меня есть три модуля — User, Cart и Product, по сути, я должен по айди User искать нужный Cart и помещать туда ObjectId из Product, дополнительно прикрутив туда колличество(count) этого ObjectId и totalprice, честно говоря, на этом этапе, я вообще не понимаю, как выстраивать эту модель Cart, две другие у меня полностью готовы. Если у вас есть кусок кода с подобным исполнением или какое-то видео с разработкой интернет магазина с MongoDB, скиньте пожалуйста, язык не важен, хоть китайский
Hannibal
Hannibal
Пока все у меня выглядит так
Hannibal
Эту схему не стоит дополнить массивом Cart, в котором будет айди продукта, число этого продукта и вне массива тоталпрайс? Я верно мыслю?
Alexandrr
Эту схему не стоит дополнить массивом Cart, в котором будет айди продукта, число этого продукта и вне массива тоталпрайс? Я верно мыслю?
кард должна относиться к аккаунту пользователя, быть связана по айди в объекте пользователя. товар должен содержать только те поля, которые непосредственно к нему относятся. в нем не должно быть каких-то "user, numberpage". numberpage - что это
Alexandrr
{'user': 'usj2idkwi29q82kqie91', 'login': 'login_1', 'password': 'password_1', 'card': [{'item_1': 'usj2idkwi29q82kqie91', 'amount': 10}, {'item_2': 'usj2idkwi29q82kqie91', 'amount': 10}, {'item_3': 'usj2idkwi29q82kqie91', 'amount': 10}]} {'user': 'usj2idkwi29q82kqie91', 'login': 'login_1', 'password': 'password_1', 'card': {'usj2idkwi29q82kqie91': 10, 'usj2idkwi29q82kqie91': 15, 'usj2idkwi29q82kqie91': 110} пример моделей юзера, отличаются корзины, у каждой структуры корзины есть свои плюсы и минусы
Харамбус
Мб кто юзает mozilla firefox, я цветовую тему на мотив монги забабахал, чекните) https://addons.mozilla.org/addon/mongodb-theme/
Hannibal
В чем может быть проблема, если в саму коллекцию отправляется актуальная информация, но в res() идет массив с опозданием в одно действие?
Hannibal
В чем может быть проблема, если в саму коллекцию отправляется актуальная информация, но в res() идет массив с опозданием в одно действие?
export const addToCart = async (req, res) => { try { const cart = await CartModul.findOne({ user: req.userId }); if (cart) { const product_id = req.body.product_id; const item = cart.cartItems.find((c) => c.product_id == product_id); console.log("item", item); if (item) { try { const cart = await CartModul.findOneAndUpdate( { user: req.userId, "cartItems.product_id": product_id }, { "cartItems.$": { ...req.body, quantity: item.quantity + req.body.quantity, totalPrice: item.totalPrice + req.body.price, }, } ); if (cart) { return res.status(200).json({ cart }); } } catch (error) { return res.status(400).json({ error }); } } else { try { const cart = await CartModul.findOneAndUpdate( { user: req.userId }, { $push: { cartItems: req.body, }, } ); if (cart) { return res.status(200).json({ cart }); } } catch (error) { return res.status(400).json({ error }); } } } else { try { const cart = new CartModul({ user: req.userId, cartItems: req.body, }); cart.save(); res.json(cart); } catch (error) { return res.status(400).json({ error }); } } } catch (error) { return res.status(400).json({ error }); } };
Hannibal
по умолчанию findAndUpdate возвращает предыдущее состояние документа. Чтобы получать новое надо указывать параметр new https://stackoverflow.com/questions/32811510/mongoose-findoneandupdate-doesnt-return-updated-document
Эту проблему решил, но все равно, спасибо вам большое, только на горизонте появилась новая 😂 Теперь он не присылает новые данные именно при создании Schema, т.е. если эта первое добавление в корзину, вот тут: const cart = new CartModul({ user: req.userId, cartItems: req.body, }); cart.save(); console.log(cart); res.json(cart); У него есть какие-то параметры, которые работают подобным же образом?
Nick
ну или await
Hannibal
ну или await
Чет я сильно туплю сегодня, спасибо ❤️
Marty
Ребята, всем привет! Как орагизовать добавление id в документе по типу serila в постгресе?
Mukhammed
https://github.com/percona/mongodb_exporter Подскажите, тут обязательно должна быть авторизация, чтобы он работал? Собрал экспортер с бинаря, кроме mongodb_up ничего не передает
Anonymous
😃
Mukhammed
Значение mongodb_up: 1?
+ добавил пару флагов, метрик стало побольше, но в дашбордах не все есть все еще
Cheusov Alexandr
будет очень много метрик
Nick
Ребята, всем привет! Как орагизовать добавление id в документе по типу serila в постгресе?
в коде пишите логику или там мидлвари или еще както, в монге есть только один генератор ид
Аскольд
await User.find({status:{$ne: 20} && {$ne:5} }) подскажите как получить поля статусы которые не равны каким то значениями(в моем случае 20 и 5). пытался вот так, но видимо не то UPD. разобрался. ({status: {$nin: [20, 5}})
Nick
😢 спасибо
но лучше откажитесь от этой идеи и используйте встроенные идшники
Marty
но лучше откажитесь от этой идеи и используйте встроенные идшники
У меня есть коллекция с документами, и мне как-то нужно получить именно последний документ. Делать сортировку по айдишнику и лимитом получать первую коллекцию - первое что пришло в голове
Аскольд
db.demo141.find().sort({_id:-1}).limit(1); https://www.tutorialspoint.com/mongodb-query-to-find-last-object-in-collection
Nick
У меня есть коллекция с документами, и мне как-то нужно получить именно последний документ. Делать сортировку по айдишнику и лимитом получать первую коллекцию - первое что пришло в голове
обычно "последний" значит самый молодой и определяется по времени. Время есть в монговском id, но оно не дает гарантий при простановке _id в драйвере в софте, поэтому рекомендуется вводить воле с временем которое завазяывается на какоето бизнес событие
Marty
Так и есть, самый молодой. Мне нужен некий стек, если можно так назвать) Внес запись в коллекцию - ее же и достал
Nick
Так и есть, самый молодой. Мне нужен некий стек, если можно так назвать) Внес запись в коллекцию - ее же и достал
Внес запись в коллекцию - ее же и достал - она у вас итак есть, зачем ее доставать?
Marty
Внес запись в коллекцию - ее же и достал - она у вас итак есть, зачем ее доставать?
Рассылка. Вношу определенные данные в коллекцию в виде текста и фото, например. Эти же данные отправляются юзерами
Аскольд
я в питоне не силен 😁
Marty
🙂
Аскольд
попробуйте убрать db в начале и просто collection.find() .......
Marty
db - клиент базы данных, db_collections сама коллекция с которой данные считываются
Marty
так берите эти данные и сразу шлите юзерам, зачем выборку еще делать?
Как вариант сделать так, чтобы после рассылки запись удалялась, таким образом будет всего одна запись в коллекции
Nick
Как вариант сделать так, чтобы после рассылки запись удалялась, таким образом будет всего одна запись в коллекции
вы чтото мудрите, в таком случае вам вообще бд не нужна. По поводу ошибки выше - вам даи код для стандартного js монгодрайвера, переделайте синтаксис к тому что вы у себя используете для работы с монгой
Nick
А что использовать? Запись в файл?)
ничего не использовать, просто в памяти все разруливать. Как я понял вам хранение на самом деле то и не нужно
Marty
У меня работа телеграмм-бота. Я не могу нигде не хранить данные для рассылки. Да и к тому же у меня орагнизована другая коллекция для хранения данных с рассылкой, но уже с датой и временем (типо планировщика). Поэтому с любом случае БД будет задействована
Marty
тогда просто добавляйте поле с временем и делайте по нему выборку с сортировкой и индекс не забудьте
Да можно, конечно, но логика рассылки не подразумевает наличие времени. Нажимаете на кнопку в боте - бот делает рассылку. Там время то ни к чему. Я думал создать какой-либо "documnet_id" по миму айдишника, который создается монгой по умолчанию. И делать сортировку по document_id. Но функционала как auto_increment в MySQL или serial в постгре я не нашел
Marty
Ну, ладно, спасибо
Sergey
всем привет, можно ли _id сделать обычным id?
Anton
Добрый день. Подскажите, пожалуйста, если одну из трех нод монга кластера (риплика сет) вывести из него, то будут ли на этом сервере доступны базы?