Size: a a a

2020 June 30

ИК

Иван Кривошеев... in rannts
Оптимизация)
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Нет, это даже оптимизацией не назовёшь. Быстрее было бы ничего не обновлять, если документа больше нет в базе.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Делать update тех полей что изменились - это нормально. А вот upsert - нет.
источник

SZ

Sergey Z in rannts
Хороший разбор
источник

SZ

Sergey Z in rannts
Собеседование наоборот: вопросы соискателя к компании.

«Хочу очередной раз поднять тему про найм. Только я собираюсь поговорить об этом с точки зрения кандидата, а не работодателя. Ведь собеседование, вопреки многим стереотипам, процесс двусторонний»: http://amp.gs/20Io
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Да, особенно можно "козырнуть" вопросом
"Есть ли у вас стратегия развития? Что в ней запланировано через 2 года?"
в ответ на вопрос к тебе "Кем вы видите себя через 5 лет?"
источник

AZ

Alexander Zelenyak in rannts
Kirill (Cykooz) Kuzminykh
Если тут кто-то использует Mongoengine, то предупреждаю вас о злобном баге в этой поделке криворуких разработчиков (которые не умеют даже избавляться от циклических импортов по нормальному).

Метод .save() документа по дефолту вызовет upsert при обновлении документа в базе. При этом обновление происходит только тех полей, которые вы изменили. Угадайте что будет если параллельный процесс удалил к этому моменту документ, который вы обновляете?
А будет такая жопа, что в результате в базу будет добавлен документ с тем же самым _id, но в нём будут только те поля, которые вы изменили. Всех остальных полей в нём не будет.
Единственное что может спасти - это если среди "пропавших" полей есть уникальное поле, тогда вы хотя бы начнёте быстро получать ошибки уникальности, когда такая херня с одновременным update-delete будет повторяться. Я именно только так и смог отловить в логах реальную причину. А до этого только видел иногда, что в базе появляются документы с неполным набором полей и грешил на "кривую монгу".
Mongoengine как семь лет назад был ненужной поделкой, созданной для того, чтобы отворотить от монги, так, кажется, ей и остался.
источник

AZ

Alexander Zelenyak in rannts
Начинаете новый проект — возмите мой ODM. Как раз после косякоа ME написал.
Он плохо документарован и, местами, не идеален, но всяко лучше ME. Плюс есть я, который помочь в трудную и не очень минуту.
https://github.com/zzzsochi/yadm
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Alexander Zelenyak
Mongoengine как семь лет назад был ненужной поделкой, созданной для того, чтобы отворотить от монги, так, кажется, ей и остался.
Видимо да. Мне он удобен тем что можно описать схему документа  (о нет, схема для монги, какое кощунство!) и не возюкаться в коде со словариками через раз используя .get(key, default)
источник

AZ

Alexander Zelenyak in rannts
Kirill (Cykooz) Kuzminykh
Видимо да. Мне он удобен тем что можно описать схему документа  (о нет, схема для монги, какое кощунство!) и не возюкаться в коде со словариками через раз используя .get(key, default)
Вот для этого я YADM и написал — объекты со схемой, вместо словариков.
источник

AZ

Alexander Zelenyak in rannts
При том, я не стал калечить язык запросов джанго-лайк-эктив-рекордами и сделал всё максимально прямолинейно.
источник

AZ

Alexander Zelenyak in rannts
Но полноценные кверисеты присутствуют. Ибо удобно.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Есть ещё у меня "великая проблема" с самой MongoDB. Это создание коллекций с индексами (особенно уникальными). Как это сделать вызвав команду создания всего вот этого только один раз, и при этом сделать это гарантированно до того, как хотя бы один документ попадёт в эту коллекцию.
Фишка в том, что коллекция создаётся в монге автоматом при первом же запросе на добавление или измененние документа в ней. И если не успеть создать уникальный индекс, то можно получить дубликаты и потом хрен ты этот индекс создашь.

В Mongoengine сделали супер тупо - можно в модели указать автоматическое создание индексов, и тогда mongoengine на каждый вызов save будет вызывать создание индексов. На каждый, Карл!
Монга конечно не совсем дура, и не пересоздаёт уже существующие индексы, но тем не менее лишний запрос на каждый save документа.

Есть конечно ещё один варинат - перед тем как запустить основное приложение на всех 100500 серверах, надо выполнить скрипт, который создаст все коллекции с индексами. Топорно, не удобно, увеличивает off-time при обновлениях приложения, но вполне работает.
источник

AM

Artem Malyshev in rannts
Kirill (Cykooz) Kuzminykh
Косяк в том, что они делают upsert, вместо update.
Мне кажется для метода с именем save как раз нормально заново вставлять объект. То что подефолту улетают не все поля, это больше странно. Такое обычно за опцией прячут.

Тут проблема больше в том, что вместо одного метода save лучше сделать два create и update.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Artem Malyshev
Мне кажется для метода с именем save как раз нормально заново вставлять объект. То что подефолту улетают не все поля, это больше странно. Такое обычно за опцией прячут.

Тут проблема больше в том, что вместо одного метода save лучше сделать два create и update.
Для Django  ты тоже считаешь был бы нормально если save() использовал UPSERT?
источник

AZ

Alexander Zelenyak in rannts
Kirill (Cykooz) Kuzminykh
Есть ещё у меня "великая проблема" с самой MongoDB. Это создание коллекций с индексами (особенно уникальными). Как это сделать вызвав команду создания всего вот этого только один раз, и при этом сделать это гарантированно до того, как хотя бы один документ попадёт в эту коллекцию.
Фишка в том, что коллекция создаётся в монге автоматом при первом же запросе на добавление или измененние документа в ней. И если не успеть создать уникальный индекс, то можно получить дубликаты и потом хрен ты этот индекс создашь.

В Mongoengine сделали супер тупо - можно в модели указать автоматическое создание индексов, и тогда mongoengine на каждый вызов save будет вызывать создание индексов. На каждый, Карл!
Монга конечно не совсем дура, и не пересоздаёт уже существующие индексы, но тем не менее лишний запрос на каждый save документа.

Есть конечно ещё один варинат - перед тем как запустить основное приложение на всех 100500 серверах, надо выполнить скрипт, который создаст все коллекции с индексами. Топорно, не удобно, увеличивает off-time при обновлениях приложения, но вполне работает.
Ты так часто создаёшь коллекции?
Я по этому поводу вообще не парюсь. Если надо что-то кастомное, то иду в базу и делаю до того, как отправлю код. Один раз, кажется, приходилось...
А обычно — пусть запись начинается. Потом иду в базу и дёргаю создание нужных индексов. Всё максимально тупо.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Как по мне это совсем не очевидное поведенеие
источник

AM

Artem Malyshev in rannts
Я считаю само существование двойственного метода save проблемой.
источник

AZ

Alexander Zelenyak in rannts
Я тут скорее считаю проблемой само удаление объектов из базы...
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Alexander Zelenyak
Ты так часто создаёшь коллекции?
Я по этому поводу вообще не парюсь. Если надо что-то кастомное, то иду в базу и делаю до того, как отправлю код. Один раз, кажется, приходилось...
А обычно — пусть запись начинается. Потом иду в базу и дёргаю создание нужных индексов. Всё максимально тупо.
У нас 4-5 стендов на которых развёрнуто приложение, и они обновляются не всегда одновременно. Иногда может много времени пройти между тем как выпустим новый релиз и тем как мы обновим один из стендов.
Очень не хочется помнить все детали того, что надо сделать на стенде ручками прежде чем выкатитить обновление. Хочется просто нажать в Jenkins кнопку и что бы оно выкатилось без ручной работы.
источник