Leonid
это очень функциональный инструмент
Leonid
может оно тру по умолчанию
Ростислав ✚
может оно тру по умолчанию
Если так то совсем ничего не добавляет)
Leonid
Если так то совсем ничего не добавляет)
чет я недогоняю. вам нужно что бы при отсутствии обновляемого документа он НЕ создавался?
Ростислав ✚
чет я недогоняю. вам нужно что бы при отсутствии обновляемого документа он НЕ создавался?
Мне нужно что бы если этот объект уже есть оно его НЕ трогало, а если нету то создало
Leonid
аа.
Leonid
из коробки такое вроде не поддерживается. нужно кодом if писать
Ростислав ✚
чере find ?
Leonid
я бы count использовал. его можно на индекс завязать. а find будет документ выгружать
Leonid
👍
Dmitriy
Мне нужно что бы если этот объект уже есть оно его НЕ трогало, а если нету то создало
insert по унику с соответствующей обработкой ошибки про unique constrain
Leonid
а если это штатная ситуация? каждый раз хэндлить эксепшн?
Leonid
оч дорого
Dmitriy
а если это штатная ситуация? каждый раз хэндлить эксепшн?
у вас исключение обрабатывается в конкретном месте в данном случае, а не супер глобально
Leonid
все равно. если у вас 50% должны "крэшится" это очень дорого. Лучше проверить на наличии
Leonid
т.к. при генерации ошибки еще и контекст выполнения сериализуется.
Leonid
оч дорого
Dmitriy
крайне спорный момент, runtime приложения в большенстве случаев гораздо дешевле рантайма базы
Dmitriy
особенно если мы говорим про hl на который вы намекаете
Leonid
все равно будет больше оверхеда если мы наличие документа будем через try { insert } catch обрабатывать
Dmitriy
вы в любом случае каждый вызов к базе обрабатываете через error handling, т.к. ошибка может возникнуть в том числе и при получение count
Dmitriy
в зависимости от яп обработка может быть явная или неявная, но она есть
Leonid
все верно. но в случае явной ошибки в драйвере запускается куча оброботчиков в том числе сериализуется контекст и сама ошибка, это накладные расходы нежели вернуть count
yopp
Вообще вы советуете оптимизировать вещи, когда нет реальной проблемы
Ростислав ✚
У меня есть эндпоинт который принимает поток с клиента(большой csv) и через readline добавляет по одной строке в бд, но я так понимаю это не очень эффективно, можно как-то кусками в бд закидывать? Желательно без дубликатов
Anonymous
У меня есть эндпоинт который принимает поток с клиента(большой csv) и через readline добавляет по одной строке в бд, но я так понимаю это не очень эффективно, можно как-то кусками в бд закидывать? Желательно без дубликатов
Сделайте уникальные индексы по полям, по которым не хотите дубликатов, батчами закидывайте через collection.InsertMany() с ordered: false (иначе вся вставка упадёт на первом дубликате, с false - упадут только дубликаты) Например так
🤔
А можно как то рейзить из пайплайна ошибку если ничего не нашлось, а дальше ещё есть действия?
🤔
(Опционально, не всегда)
First
как правильно попгуглить, нужно findOneAndUpdate({status: 'ok', counter < 5} вот типо поле counter проверить
Nick
$lt
First
спасибо
First
await Accounts.findByIdAndUpdate(account._id, { $set: { cookies: {} } })
First
не ставит пустое поле, пробовал null и пустую строку
First
есть какая то особенность?
First
First
выше норм работает с айди, дока есть
First
undef тоже не ставит 🤔
Ростислав ✚
И да, если у вас нет с этим проблемы - не делайте ничего. "я так понимаю, это не очень эффективно" - не проблема
А будет работать не по индексам а по всему объекту? Потому что уникальных полей нет, только их комбинация уникальна. Для меня это не было бы проблемой, но сказали сделать максимально эффективно, а у меня каждый объект проверяется на уникальность перед добавлением(countDocuments), поэтому выходит очень долго.
Ростислав ✚
Тоесть записать все параметры в дополнительный парметр и получится уникальный?
Dmitriy
Тоесть записать все параметры в дополнительный парметр и получится уникальный?
т.е. почитать документацию: https://docs.mongodb.com/manual/core/index-unique/ вам нужен раздел unique compound index
Nick
Всем привет! Подскажите - есть mongodb в атласе, 1 кластер m30 replicas-set из 3 нод. Кластер расположен в 1 регионе (провайдер google cloud). Хочу масштабиовать кластер между разными регионами. Как я понимаю, для mongo размещенной в atlas достаточно через изменения кластера включить global writes и добавить необходимые зоны? При этом как произойдет масштабирование кластера? Буду благодарен любым советам\ссылкам.
Artem
Есть вопрос к сообществу по бест практис в пагинации. Мы реализовали fast-pagination по objectID (objectID > last_id + limit [https://scalegrid.io/blog/fast-paging-with-mongodb/]). Но не учли, что в кластере (replica set) на каждой ноде генериуется разные objectID, что не позволяет их фильтровать по последнему полученному objectID. Если рассматривать генерацию ID до вставки на клиенте, для сохранения последовательности, то там также несколько нод в балансировке. Подскажите, пожалуйста, какие есть варианты “правильной” fast-pagination на кластере? Быстрый поиск не дал ответов на этот вопрос...
Artem
эм, как так на каждой реплике разные objectID?
Отличается все три части objectid, в зависимости от того на какую ноду пришел запрос на создание. Вне зависимости от кластеризации _id должен расти последовательно? Я имею ввиду должна меняться только последняя часть _id. Мы не задаём Id при создании на клиенте. Но ваш вопрос навёл меня на мысль, что может быть библиотека генерит сама его до вставки и в зависимости от ноды она выдает разный результат.
Vladimir
Отличается все три части objectid, в зависимости от того на какую ноду пришел запрос на создание. Вне зависимости от кластеризации _id должен расти последовательно? Я имею ввиду должна меняться только последняя часть _id. Мы не задаём Id при создании на клиенте. Но ваш вопрос навёл меня на мысль, что может быть библиотека генерит сама его до вставки и в зависимости от ноды она выдает разный результат.
А, в этом смысле, я просто подумал, что у Вас репликасет и каждая из реплик отдает для одной и той же записи разные ObjectID и решил, что я явно что-то упустил в этой жизни. Но вообще: https://docs.mongodb.com/manual/reference/method/ObjectId/ Если верить доке монги, то ObjectID (если он генерируется правильно, а не от фонаря), должен возрастать со временем. Т.е. по нему можно спокойно сортировать вне зависимости от того, на какой из нод он был сгенерирован (если считать, что везде часы правильные)
Vladimir
Ну или просто к записям добавить поле created: IsoDate(), индекс по нему и сортировать\ограничивать по этому полю, а не ObjectID, если все же окажется, что ObjectID не подходит по какой либо причине
Artem
Ну или просто к записям добавить поле created: IsoDate(), индекс по нему и сортировать\ограничивать по этому полю, а не ObjectID, если все же окажется, что ObjectID не подходит по какой либо причине
Спасибо. Индекс дополнительный не хотелось навешивать, так как запросов на вставку на порядки больше чтения. Но посмотрю либу, наверное она генерит в зависимости тот ноды
Danila
Доброго дня. Не работал с mongo ранее. Установил mongod 4.2.2 на centos 7. При попытке запустить через Systemctl в журналах выдает code:100. Но при всем при этом она вроде как работает, т.к. подключиться выходит. Не могу понять логику.
madspectator
А что показывает pstree -s <pid>, где <pid> это pid mongod процесса?
Ilya
День добрый, странный вопрос, может кто сталкивался. Суть в том, что мне надо добавить для записей новое автоинкрементируемое поле что-то item_num : 1 Которое будет int от 1 до бесконечности И чтобы оно всегда увеличивалось для новых записей И если была запись с макс item_num : 55 ее удалили, чтобы следующая при создании атоматически получила item_num : 56 и были бы записи с item_num : 54 и 56 как-то так Подскажите пожалуйста варианты для решения такой задачи?
Ilya
коллекция для инкрементов.
А можно более подробнее?
Mike
А можно более подробнее?
ну создаешь коллекцию для инкрементов)) при добавлении в нужную коллекцию, миддлварой model.pre('save') берешь инкремент и присваиваешь его для item_num и инкрементируешь инкремент (тавтология)
Ilya
ну создаешь коллекцию для инкрементов)) при добавлении в нужную коллекцию, миддлварой model.pre('save') берешь инкремент и присваиваешь его для item_num и инкрементируешь инкремент (тавтология)
идею понял, но это же просто жесть :) мол чисто инкремент зранить в отдельной колекйции и все время ее дергать, а когда дернул +1
Ilya
Пересмотреть причину зачем это надо
О! Ну причина просто топ. Менеджер так хочет
yopp
Спросите сколько ресурсов он готов на это потратить
Ilya
ну если жесть то тогда postgre mysql бери
Ага, только перешли с mysql На монгу :)
Ilya
Спросите сколько ресурсов он готов на это потратить
Думаю ответ будет - у тебя один день, завтра покажешь как работает
Mike
Ага, только перешли с mysql На монгу :)
странный подход, если уже на следующий день сразу же индекс с автоикрементом нужен. вы увеерены что выбор был оправдан?
yopp
Монга такое не поддерживает, вам придётся реализовывать счётчики самостоятельно. Если есть транзакции то через них. Если транзакции нет, то через write only $inc, когда вы делаете атомарную операцию инкремента чтоб прочитать следующее значение счетчика
Ilya
странный подход, если уже на следующий день сразу же индекс с автоикрементом нужен. вы увеерены что выбор был оправдан?
я вообще топлю против этой идеи И топлю, что _id и так огонь Но он типо некрасивый и неудобно называть а ссылку скинуть сложно тип чтобы можно было сказать посмотри запись 566
yopp
Это больше чем сутки работы
Ilya
Это больше чем сутки работы
Я то это понимаю :) Все можно сделать, вопрос в уровне костылей и гемора :)
yopp
Хост в hex
Ilya
Используйте _id, но преобразуйте его в человекочмтаемый вид «дата-счётчик-хост»
Видел вот такое https://data-flair.training/blogs/mongodb-auto-increment-sequence/ но как по мне кощунство\
Ilya
_id 12битное заменили тупо интовым числом Какое то УГ
Ilya
db.order_number.find_one_and_update( filter={}, update={'$inc': {'number': 1}}, upsert=True, projection={'number': True, '_id': False}, return_document=ReturnDocument.AFTER, session=session ) у нас так сделано, в коллекции лежит один документ и инкриментится у него поле number