Nick
или используйте версии доков самостоятельно, что по сути тоже самое
Daler
session.startTransaction(); db.Products.find() Долгая калькуляция db.Products.update() session.startTransaction(); db.Products.find() Долгая калькуляция db.Products.update() session.startTransaction(); db.Products.find() Долгая калькуляция db.Products.update() session.startTransaction(); db.Products.find() Долгая калькуляция db.Products.update()
Nick
4 потока, что будет при выполнении find?
смотря что назвать потоками, будет 4 транзакции
Nick
будут они в потоках или нет не имеет значения
Daler
во всех find значение будет одинаковым?
Daler
допустим количество продукта 2
Daler
все транзакции получат продукт с количеством в 2?
Nick
все транзакции получат продукт с количеством в 2?
да, ведь он же не поменялся и не залочился. Хотите получить все кроме залоченного - нужно запдейтить или выставить флаг или версию инкрементнуть и указать это в выборке. Локов на чтение как в мускуле в монге нет
Nick
select for update вроде как под капотом так же делает, маркирует строку как если бы она апдейтилась в транзакции
Daler
session.startTransaction(); db.Products.findAndModify(query: {условие}, update: { $inc: { __v: 1 } },) Долгая калькуляция db.Products.update()
Nick
Так я залокаю продукт?
Да, если накрутите проверку версий
Алишер Абдуллаев
привет. советуюсь. у заказов есть from_date равен iso date мне нужно найти все заказы у которых месяц в from_date равен c 0-11. то есть, конечный результат -> в январе (месяц 0) равен n заказов, в феврале (месяц 1) равен n заказов.
Maksim
Привет, всем. Помогите советом как сделать правильно Я с моногой особо плотно ранее не работал. Есть монга стоит на сервере, на сервере 6 рейд размер базы 1 тер. в этом сервере вылетел один диск, из за этого нагрузка на остальные диски выросла в разы Остановить запись в базу можно не более чем на пару часов, но диски в сервере по 10 тер. Решили на момент замены дисков и ребилда рейда сервер вывести из работы. Для сохранения данных, и продолжения записи в базу решили поднять реплику. Подскажите как правильно это сделать. Могу ли я поднять еще одну монгу аналогичной версии, и настроить типо мастер слейв реплику ? Я точнее уже поднял еще одну ноду для реплики, и небольшой сервер под арбитра Вопрос Можно теперь в текущую ногу где есть все данные, добавить чистую монгу не заливая туда дамп
~timur~
Здравствуйте, у меня в бд есть документы {"key": "текст1"} и так далее, можно ли сделать поиск по строке типа "текст1 ... ...", чтобы как бы в той строке по которой я ищу документ в начале была часть ключа, а потом еще какие-то слова?
Maksim
Чтоб она скопировала все туда, а после полной синхроннизации (да как ее проверить) потушить праймери ноду и переключить все на секондари (чтоб она стала праймери)
Maksim
или нужно все остановить, сделать дамп, собрать реплику, туда залить дамп и только после продолжать запись в реплику
Andrey
Привет, всем. Помогите советом как сделать правильно Я с моногой особо плотно ранее не работал. Есть монга стоит на сервере, на сервере 6 рейд размер базы 1 тер. в этом сервере вылетел один диск, из за этого нагрузка на остальные диски выросла в разы Остановить запись в базу можно не более чем на пару часов, но диски в сервере по 10 тер. Решили на момент замены дисков и ребилда рейда сервер вывести из работы. Для сохранения данных, и продолжения записи в базу решили поднять реплику. Подскажите как правильно это сделать. Могу ли я поднять еще одну монгу аналогичной версии, и настроить типо мастер слейв реплику ? Я точнее уже поднял еще одну ноду для реплики, и небольшой сервер под арбитра Вопрос Можно теперь в текущую ногу где есть все данные, добавить чистую монгу не заливая туда дамп
Самый жеский, но! Рабочий метод - остановить монгу на 1 сервере, подключить внешний ssd на 2 тера например по usb3, скопировать всю db - путь в конфиге монги прописан, на этот ssd, займет где-то около 1 часа, залить директорию на другой сервер, еще чуть более часа, если диски быстрые(если медленные- то долго) и на этом сервере установить докер и скачать образ монги той же версии! Обязательно поменять права и владельца на все файлы на новом сервере, чтоб монга в контенере подцепила. Стартовать контейнер с пробросом директории и конфига. Итого на внешний диск чуть более 1 часа, на новый сервер при таком способе нще столько же + 10 мин на образ провервку работы. Делал такое пару раз.
Andrey
Утром такое просто сегодня проворачивал, standalone версия и база 1.1 тера
Andrey
Потом обратно также, естественно, данные которые идут в базу - я останавливал процесс, и потом вознобновлял.
Andrey
С репликами за 2 часа сомневаюсь, что будет успех.
Maksim
Потом обратно также, естественно, данные которые идут в базу - я останавливал процесс, и потом вознобновлял.
Сервер на хецнере, база чуть более 1 тера 1.2 Диск в аренду дорого наверное будет, но спа за вариант Я думаю попробовать сделать рсинк на резервный сервер Потом стопнуть, и сделать ещё раз рсинк и далее запустить на новом. Так время простоя думаю будет минимальным
Maksim
Я понял, тема с репликой плохая
Andrey
Если был в стандэлоне была бд - то самый быстрый стопить, копировать, на новом та де версия монги. И потом обратно.
Andrey
Согласен, будем узнавать варианты у хецнер
Если бы диски были ссд и сеть 10г - то прям норм можно было бы
NCR
Добрый вечер Есть лимиты на количество коллекций?
NO WAR!
Всем привет. Только изучаю Монго. Знаю что по запросу найду в коллекции много документов, а мне нужно будет изменить только 2. Есть в Монго что-то чтобы ограничить результат фильтрации до необходимого количества документов?
NO WAR!
https://www.mongodb.com/docs/manual/reference/method/db.collection.find/#find-documents-that-match-query-criteria
Я это читал вроде. Не видел там ограничения количества найденных документов. Что я пропустил? На что смотреть?
Nick
Я это читал вроде. Не видел там ограничения количества найденных документов. Что я пропустил? На что смотреть?
тогда перефразируйте вопрос, выборка задается набором условий, собственно вам нужно только написать эти услвоия
NO WAR!
тогда перефразируйте вопрос, выборка задается набором условий, собственно вам нужно только написать эти услвоия
Например я ищу документы .find({ bar: 'foo' }). Я знаю что найду много таких документов. Но мне нужно будет изменить только 2 из них. Вопрос. Можно ли как-то ограничить выдачу условного .find до 2-х документов, что их потом updateMany? 😀 Я понимаю что я 2 раза могу поискать по одному документу, но стало интересно. Вдруг существует какой-то специализированный инструмент, что сразу найти 2.
Nick
Например я ищу документы .find({ bar: 'foo' }). Я знаю что найду много таких документов. Но мне нужно будет изменить только 2 из них. Вопрос. Можно ли как-то ограничить выдачу условного .find до 2-х документов, что их потом updateMany? 😀 Я понимаю что я 2 раза могу поискать по одному документу, но стало интересно. Вдруг существует какой-то специализированный инструмент, что сразу найти 2.
выбрать опредленное количество - используйте limit. Если нужна следующая порция - еще добавляйте skip перез лимитом. Обновить только 2 например не поулчится, если явно не задать например идентификаторы этих двух элементов. Можно сделать через агрегацию с мержем ($our: merge), но может быть не стабильно
Валентина
Как я могу спарсить определенные айдишники? Есть какой-то метод в монгоДБ или придется чисто через фильтр реализовывать ? По типу у меня пользователи добавили несколько товаров в желаемое ( сохраняются айдишники в объекте юзера ), мне нужно при переходе в раздел "желаемое" отоброжать эти товары, то есть из объекта Юзера забрать поле желаемое, где хранятся айди товаров, дальше обратится к объекту товаров сравнить их с айдишниками и отобразить нужные
NO WAR!
выбрать опредленное количество - используйте limit. Если нужна следующая порция - еще добавляйте skip перез лимитом. Обновить только 2 например не поулчится, если явно не задать например идентификаторы этих двух элементов. Можно сделать через агрегацию с мержем ($our: merge), но может быть не стабильно
Пробую. collection.find(query) .limit(2) - и да, mongo выводит только 2 документа, хотя нашел больше .update(data) - но апдейтит все, хотя я хочу апдейтнуть только 2. Есть способ это сделать командами Монго? Что-то не так делаю?
𝔏𝔢𝔯𝔬𝔶
свем привет, подскажите пожалуйста имею таблицу tournaments, в ней массив rooms с id комнат, как я могу получить все турнаменты сразу с комнатами?
𝔏𝔢𝔯𝔬𝔶
типо такого
𝔏𝔢𝔯𝔬𝔶
Nick
Пробую. collection.find(query) .limit(2) - и да, mongo выводит только 2 документа, хотя нашел больше .update(data) - но апдейтит все, хотя я хочу апдейтнуть только 2. Есть способ это сделать командами Монго? Что-то не так делаю?
именно обновить часть документов из выборки не получится, кроме как выстраивать пайп с $merge https://www.mongodb.com/docs/manual/reference/operator/aggregation/merge/ , но на сколько он будет стабилен не знаю, для таких задач не использовал
Nick
типо такого
агрегация с $lookup, либо если монгус, то populate()
El
Подскажите для цены какой тип выбрать?
El
Number он же не точный
El
Есть decimal
Alexandrr
Number он же не точный
https://t.me/mongodb_ru/120431
Nick
Подскажите для цены какой тип выбрать?
https://www.mongodb.com/docs/manual/tutorial/model-monetary-data/
Tony
Привет, подскажите как правильно составить запрос. У меня есть некоторые объекты содержащие массив дочерних объектов. { "id": 1, "entityState": 1, "children": { obj1, obj2, ... } } я хочу найти объект по id, entityState и чтобы в массиве дочерних объектов вернулись только те объекты у которых поле entityState равно 1. Что то не приходит на ум, как это сделать
Tony
можно просто $elemMatch использовать если в find, он отфильтрует. Либо через агргеацию и $filter
elemMatch пробовал find({ "_id" : ObjectId("62ecb64b801330cc1d5196c3"), "entityState" : 1, "files" : { $elemMatch : { "entityState" : 1 } } })
Tony
не работает
Tony
выдает все элементы массива
Nick
его в проекцию надо
Nick
find( { _id : 3 }, { files : { $elemMatch : { entityState : 1 } } } )
Tony
Nick
следите за запятыми и скобками
Nick
find( query_object, projection_object )
Tony
а, лишние скобки
Tony
ну массив отфильтровался верно, но вот данные самого объекта не вернулись, вернулся только его id и массив с дочерними объектами. Выходит мне прописывать все его поля придется чтобы получить все данные?
Tony
понял, попробую
Tony
тогда просто агрегация и $filter, думал вам надо именно с массивом работать
я правильно понял? aggregate( [ { $match : { "_id" : 1, "entityState" : 1, "files" : { "$elemMatch" : { "entityState" : 1 } } } } ] )
C
dogs: [ { name: String, toys: { type: Schema.Types.ObjectId, required: true, ref: "Corps" }, }, }, ], Можно ли имея такой ключ в модели монгуса, как-то сделать так, чтобы запретить сохранение пустого массива? Знаю что такая структура в целом неправильная, но какая есть, сейчас её сменить возможности нет
C
посмотрите на проверки https://mongoosejs.com/docs/validation.html
Та я вот смотрю, но там таких примеров нет. Там показывают что-то на подобии [{type: "...", required: true}], но у меня выходит что это не массив документов в чистом виде. А массив объектов, внутри которых есть ещё и документ
Nick
туда хоть что упихать можно
C
туда хоть что упихать можно
Или я тупой или сани не едут :) const userSchema = new Schema({ phone: { type: String, validate: { validator: function(v) { return /\d{3}-\d{3}-\d{4}/.test(v); }, message: props => `${props.value} is not a valid phone number!` }, required: [true, 'User phone number required'] } }); В их примерах у ключа пропсами прописывается валидация и тд. Но я же не могу заменитьусловную стрингу своим объектом вместо type