Zona
Etc/hosts хорошая практика :)
Не очень... Хорошая практика днс.
Zona
Так я и пытаюсь в кубере поднять без операторов. И получается что в hosts пишется локальный host: ip. Mongo1.service_mongo.mongo.svc mongo1 А сервис создается mongo1.mongo.svc
Zona
Сколько зп?
Zona
В hosts? Или в rs.conf?
Zona
Не создаётся (((( задумывается и ошибку отдает. Хотя пинг и telnet проходит....
Zona
Если создаю сервисзаписи mongo1/mongo2/mongo3 и указываю порт - всё ок. Но тогда с другого неймспейса не подключается.....
Zona
Вот тогда проблема с тем, что он хочет в конфиге подключения mongo1
Zona
Наоборот. Ns.svc.cluster.local
Zona
Вот как раз тут проблема... Не работает. Когда в rs.conf указываю
Zona
Да.
Zona
И так тоже пробовал.
Anton
Zona
В hosts добавляется запись вида: ip. (Hostname).(svc_sts).(ns).svc
Zona
Нет. Всё отлично и svc пингуется и порт доступен.
Zona
А как это понять?))))
Zona
Если в hosts добавить запись ip svc(full) всё отрабатывает отлично..... Но блин создавать доп init-pod как то извращение....
Zona
Попробую
Никита
Всем привет! Пытаюсь разобраться, как работает MongoDB в кластере. Имеется два web сервиса (две копии одного и того же сервиса), которые общаются с MongoDB: writeConcern: 1, readConcern: local, read preference: primary. Клиент (браузер) шлет два последовательных запроса (второй ждет окончание первого). Первый запрос на запись, второй на чтение. Может ли быть ситуация (не рассматриваем кейсы выбора нового лидера), когда второй запрос не получит изменения первого запроса? К примеру, как отработает в кейсе, когда первый запрос прилетит на первый web сервис, а второй - на второй?
Никита
а зачем 2 запроса? 1 не может вернуть что записал?
Можно, это следующий путь решения вопроса (более правильный). Скорее более академический вопрос у меня.
Никита
Если ждет ответа, то такого не случится
А клиенты не используют какую-то версию базы, которую используют при каждом запросе? Насколько я понимаю, там используется MVCC
Никита
Какая разница если у вас запросы не одновременные
Не может быть ситуации когда второй клиент ещё не обновил локальный номер версии, с которой он работает, к нему прилетел запрос на чтение и он прочитал информацию с использованием более старой версии? Не смог найти на официальных доках, как используется версия в операциях чтения
Nick
Не может быть ситуации когда второй клиент ещё не обновил локальный номер версии, с которой он работает, к нему прилетел запрос на чтение и он прочитал информацию с использованием более старой версии? Не смог найти на официальных доках, как используется версия в операциях чтения
Mvcc работает на уровне базы а не клиента, ваш вопрос лишен смысла. И в лучшем случае вы сами менеджерите стейт в приложении, а значит знаете его поведение и должны суметь ответить на свой вопрос
Nick
А как-то клиентские сессии используют этот номер версии?
Вы путаете клиентскии сессии в приложении и сессии при работе с базой
Никита
https://www.mongodb.com/docs/manual/reference/read-concern/#real-time-order
Именно real time order читать? У меня другие параметры read / write concern
yopp
Да, ваши параметры не гарантируют что после записи другие клиенты её увидят
yopp
Да. Записи не мгновенно становятся доступными другим тредам
Никита
Я немного запутался) @yatoba говорит, что не может быть такой ситуации, вы говорите что может быть
Никита
А есть где почитать больше деталей, почему так может произойти под капотом? Там каждый тред будет как-то работать с разной версией? Пот тредом вы подразумеваете тред внутри клиентского приложения?
yopp
В данном контексте это треды обрабатывающие запросы внутри монги. Т.е ситуация когда запись была ack не гарантирует что другие треды которые читают эту запись после ack увидят изменения Линеаризация решает эту проблему внутри монги через линейный порядок, ставя записи и чтения одного документа в одну очередь (очень упрощенно). Это сайд эффект MVCC, так как каждый тред читает/пишет состояние из своего снепшота. Т.е если снепшот читающий документ был создан раньше чем произошел коммит записи, читающий тред априори не будет видеть это в своём снепшоте, так как его версия раньше чем версия снепшота пишущего изменения
Nick
А есть где почитать больше деталей, почему так может произойти под капотом? Там каждый тред будет как-то работать с разной версией? Пот тредом вы подразумеваете тред внутри клиентского приложения?
у вас write concern: 1 запись на одну ноду, а это будет всегда праймари. read preference: primary - чтение тоже будет всегда с праймари остаются тонкости с read concern, т.к. local всетаки не прям таки гарантирует видимость, но т.к. у вас будет куча времени между отправкой ответа на записьи следующим чтением, то такая ситуация маловероятна при работе на одной ноде
yopp
https://www.mongodb.com/docs/manual/core/read-isolation-consistency-recency
Никита
Спасибо, изучаю
mfgskv ✙
могу ли я внутри апдейта получить состояния текущего рекорда на котором запускается апдейт
mfgskv ✙
?
Men
Всем привет. Вопрос такой: В mongodb можно ли primary key поле назвать по своему, а не _id?
mfgskv ✙
через findAndUpdate можно сделать
да там вроде такой же синтаксис как и в апдейте только можно сорт и проджекшн делать
mfgskv ✙
разве нет,
mfgskv ✙
?
mfgskv ✙
чет я не вижу синтаксиса для того чтоб состояние текущего свойства получить
Mashxurbek
https://www.mongodb.com/docs/manual/reference/method/db.collection.findAndModify/#mongodb-method-db.collection.findAndModify
Mashxurbek
Там опция есть
Mashxurbek
Называется new. Это опция должна быть true, и тогда этот метод вернёт обновленный документ
mfgskv ✙
мне нужно не вернуть а в апдейте прописать что например то то свойство должно равнятся текущему значению какого-то свойства и формула на нем
vladissick
Как можно найти документ по его свойствам его вложенного документа ?
Nick
Как можно найти документ по его свойствам его вложенного документа ?
через точку путь собираете find({ r.lvl1.lvl2: "val" }) работает и с массивами
vladissick
через точку путь собираете find({ r.lvl1.lvl2: "val" }) работает и с массивами
Спасибо. А не подсажите ли еще может ил быть причиной ошибки то что я пытался этот запрос создать как метод дял модели? categories.methods.getServices = function () { return Service.find({'category._id: this.id}) }
vladissick
если это прям копипаста, то тут кавычка открывается и не закрывается
вот ошибка throw new TypeError('Invalid value for schema path `' + fullPath + ^ TypeError: Invalid value for schema path category.type, got value "undefined"
vladissick
не копипаст
PSiHachina
Всем привет. Я тут миграцию пишу, всё хорошо кроме одного момента В конечном итоге нужно чтобы у всех данных _id был с 1 по порядку Подскажите как это сделать? [ { "aggregate": "events", "pipeline": [ { "$project": { "_id": 1, "events": 1 } }, { "$unwind": "$events" }, { "$project": { "_id": 0, "aggregate_id": "$_id", "event_type": "$events.event_type", "data": "$events.data", "timestamp": "$events.timestamp", "aggregate_type": "$events.aggregate_type", "version": "$events.version", "metadata": { "position": "$events.version" } } }, { "$out": "new_events" } ], "cursor": {} } ]
PSiHachina
Не) по умолчанию там ObjectID (по моему, не особо силен в mongo) А нужно чтобы были простые числа
PSiHachina
Не спорю, но либа в golang требует так
Умаров
Всем привет. мне нужна помощь. Мне нужны примеры $lookup mongodb, если кто знает, помогите!!
PSiHachina
Но при этом либа кодом это делает
PSiHachina
Я бы забил, но потом данные которые я мигрировал не валидные, из-за того что либа не может спарсить objectID в int
PSiHachina
Либа говно, я первым делом, перед тем как приступить, пошёл искать инфу про миграцию, а её там нет)
PSiHachina
Ну выкинуть нельзя) Ладно, буду дальше думать. В крайнем случае запилю миграшку на Golang, там то явно всё получится
Артем
_id никак не заменить можно пытаться костылить самому отдельное числовое поле, но в конечном итоге ты поставишь постгрес, если настолько любишь числа
gaenkov
Господа, подскажите плз, есть ли в нодовском драйвере в каком-то виде интерфейс writable stream для записи в коллекцию? Хочу сделать примерно такое: await pipeline([ sourceCollection.find().stream(), new Transform({ objectMode: true, transform(doc, enc, cb) { cb(null, mangle(doc)); }, }), destCollection.openWritableUpdateStream(), ]);
Nick
Всем привет. Я тут миграцию пишу, всё хорошо кроме одного момента В конечном итоге нужно чтобы у всех данных _id был с 1 по порядку Подскажите как это сделать? [ { "aggregate": "events", "pipeline": [ { "$project": { "_id": 1, "events": 1 } }, { "$unwind": "$events" }, { "$project": { "_id": 0, "aggregate_id": "$_id", "event_type": "$events.event_type", "data": "$events.data", "timestamp": "$events.timestamp", "aggregate_type": "$events.aggregate_type", "version": "$events.version", "metadata": { "position": "$events.version" } } }, { "$out": "new_events" } ], "cursor": {} } ]
Вы говорите про автоинкремент в ид. Встроенного такого функционала нет. Изменить ид на автоинкремент в пайплайне не получится, так же нет для этого механизмов. Вариант только переливка скриптом с подменой ид на который вам нужен. В монге _id может быть любым валидным значением и например объектом сложной структуры.
PSiHachina
Но спасибо за разъяснение
Nick
да я уже сприпт на Go написал, надо было так сразу сделать)
Но факт наличия автоинкремента попахивает, по возможности откажитесь от этого
C
Groups.find(query, null, { skip, limit, sort: { name: 1 }, }).populate({ path: "users", match: { verified: 1 }, }); Кто-то может подсказать, как можно это оптимизировать, в какую сторону смотреть? С популейтом тестовый запрос выполняется 3сек, без него 300мс.
C
Популет делает доп запрос, разбор ответа и связывание, что требует времени. Можно через лукап реализовать одним запросом
хм, я почему-то думал, что там под капотом по сути лукап и есть, но тогда попробую написать аггрегацию, спасибо
Anatoly
Всем привет Есть вью агрегация , есть поле тип(int), надо заменить его на соответствие из словаря types = {1: "type1", 2: "type2"} Как это можно сделать?