Nick
Александр
Подскажите, можно ли найти более удачное решение для следующей задачи.
Необходимо выбрать всех людей, которые находятся только в командах с определенными id.
Текущее решение следующее:
{
"teams.id": {
$all: [
"1c1aea61-023b-11e7-80bf-005056b563c3",
"d701a0c3-074f-11e7-80bf-005056b563c3"
]
},
"teams": {
$size: 2
},
},
Может есть отдельный оператор для этого?
Александр
Если что, id не монговские, внешние, но к задаче это отношения не имеет.
Tentura
Добрый день, подскажите пожалуйста, как можно выйти из такой ситуации:
Есть кластер версии 4.4 (да старенький, последний стоит на обновлении) состоящий из 6 нод, одна из которых hidden и priority 0. Создаю индекс через db.collection.createIndex() на коллекции размером в 250 гб и 128 млн документов. На мастере создание прошло, далее поехало на secondary, после чего они ушли в unreachable, в логах видно что пошло создание индексов. Из 6 нод в живых только 2 - мастер и hidden / priority 0 реплика, кворум нарушился и остался с двумя secondary в ожидании чуда когда на остальных накатится индекс.
Судя по докеhttps://www.mongodb.com/docs/v4.4/core/index-creation/#index-build-process то что реплики стали недоступны до окончания создания индексов, но главный вопрос - как было бы поступить правильно, чтобы не получить такого downtime?
yopp
Добрый день, подскажите пожалуйста, как можно выйти из такой ситуации:
Есть кластер версии 4.4 (да старенький, последний стоит на обновлении) состоящий из 6 нод, одна из которых hidden и priority 0. Создаю индекс через db.collection.createIndex() на коллекции размером в 250 гб и 128 млн документов. На мастере создание прошло, далее поехало на secondary, после чего они ушли в unreachable, в логах видно что пошло создание индексов. Из 6 нод в живых только 2 - мастер и hidden / priority 0 реплика, кворум нарушился и остался с двумя secondary в ожидании чуда когда на остальных накатится индекс.
Судя по докеhttps://www.mongodb.com/docs/v4.4/core/index-creation/#index-build-process то что реплики стали недоступны до окончания создания индексов, но главный вопрос - как было бы поступить правильно, чтобы не получить такого downtime?
Здравствуйте!
На репликах надежнее всего создавать индексы по отдельности на каждой ноде: https://www.mongodb.com/docs/manual/tutorial/build-indexes-on-replica-sets/
В вашем случае можно создавать индексы на двух нодах параллельно, так как все равно останется кворум
yopp
Сейчас вероятно уже ничего не сделать, пока не закончится создание индекса, так как эта операция уже в оплоге и даже если перезапустить ноду, она снова начнет создавать индекс, пытаясь применить операции из оплога после «грязного» завершения
yopp
yopp
Спасибо большое за ответ. По поводу rolling index тоже прочитал, когда искал варианты безопасной накатки.
Я правильно понимаю, что в принципе нет инструментов, которые позволяют останавливать создание индекса? В старых версиях я видел что был параметр --noIndexBuildRetry, который собственно позволял останавливать накатку судя по описанию, при перезапуске инстанса с этим параметром и то, он не работал с in-memory storage engine.
Можно попробовать остановить через killop, но в случае с созданием индексов это не всегда сразу прерывает их создание. С foreground индексами вообще все сложно было, по этому от этой стратегии в новых версиях отказались и все индексы всегда создаются в фоне.
Не подскажу как этот флаг работал с репликами, так как тут есть другая проблема — команда на создание индекса в оплоге. Логическое время на каждой реплике увеличивается только после успешного применения записи из лога. Как следствие если команда на создание индекса не завершилась, то логические часы будут на предыдущей записи. При старте, даже если предыдущая попытка создание индекса была предотвращена ключом, монга начнет по новой проигрывать операции из лога с текущего значения логических часов, которые все равно будут до операции создания индекса. Как следствие операция снова запустится, так как нода очевидно не может пропускать операции без нарушения целостности данных.
Rolling создание обходит эту проблему так:
1. Создание индекса не изменяет данные и с позиции хранилища меняет только метаданные коллекции (wt catalogue)
2. Метаданные коллекции не являются объектом репликации
3. Операция создания индекса происходит в standalone, как следствие команда на создание индекса не попадает в оплог
yopp
Но минус этого подхода это вывод ноды из эксплуатации на все время создания индекса, но в реплике с больше чем 1 участником это обычно не проблема, за исключением ситуации когда не хватает окна репликации. В этом случае или как получилось у вас или находить способ как увеличить оплог.
yopp
Ещё есть опция выдернуть снепшот из под праймари с небольшим даунтаймом, если фс позволяет, и поднять временно ещё одну ноду либо заменить данные на существующей.
В совсем крайнем случае ехать на одной ноде и делать полную синхронизацию
Tentura
Iwjsjjrehwu
привет, есть реплика сет. на праймари даже в полном простое забивается диск до лимитов, потом очищается и так по новой. основная коллекция ~600 гб. вводных мало, но больше инфы к сожалению нет, хотя бы есть какие-то предположения о возможных проблемах?
yopp
Armen
в базе сохранился маппинг на модели, например у Вас класс Person, в монго есть поле _class: io.project.app.Person, и если вы переместили классы или поменяли что-то может быть проблема с маппингом
Алексей
Добрый день, подскажите плз с findAndModify
данные
db.test.insertMany(
[{
id: 1001,
name: "queue",
attempts: 2,
process_at: 900
},
{
id: 1000,
name: "queue",
attempts: 2,
process_at: 950
}]
)
хочу обновить process_at в зависимости от колонки attempts делаю
db.test.findAndModify(
{
query: {
process_at: {$lte: 1000},
},
update: {
$set: {
"process_at":
{$add: [{$pow: ["$attempts", 3]}, 1000]}
}
},
new: true
}
)
На выходе получается
{"_id": "6628c056c22fa46f63f61fad", "id": new NumberInt("1001"), "name": "queue", "attempts": new NumberInt("2"), "process_at": {"$add": [{"$pow": ["$attempts", new NumberInt("3")]}, new NumberInt("1000")]}}
т.е. Find and modify Не воспринимает "$add ? или я что-то не так делаю
mongodb 5
Armen
у меня была такая проблема когда маппинг не понимал это класс или интерфейс, 100 процентов не знаю, можете попробовать.
Y
Добрый день, подскажите, в этом запросе джойню две коллекции.
Но вопрос по фильтрации. Если я правильно понимаю, как это работает, то $match выбирает сначала записи, которые по условию соответствуют первой коллекции, а потом идет джоин. Вопрос, а как-то можно в этом же запросе, чтобы после фильтрации документов первой коллекции отфильтроваться по документам второй коллекции и потом выполнить $lookup ?
cursor = adjustments_collection.aggregate(
[ {
'$match': {'value_adjustment': 319.98}
},
{
'$lookup': {
'from': 'light_snapshots',
'localField': 'id_light_snapshot',
'foreignField': '_id',
'as': 'joinedResult'
}
}
Nick
Добрый день, подскажите, в этом запросе джойню две коллекции.
Но вопрос по фильтрации. Если я правильно понимаю, как это работает, то $match выбирает сначала записи, которые по условию соответствуют первой коллекции, а потом идет джоин. Вопрос, а как-то можно в этом же запросе, чтобы после фильтрации документов первой коллекции отфильтроваться по документам второй коллекции и потом выполнить $lookup ?
cursor = adjustments_collection.aggregate(
[ {
'$match': {'value_adjustment': 319.98}
},
{
'$lookup': {
'from': 'light_snapshots',
'localField': 'id_light_snapshot',
'foreignField': '_id',
'as': 'joinedResult'
}
}
в лукапе можно указать пайплайн по выборке доков из второй коллекции. Там можно указать матч, если недостаточно просто связки по филдам
Y
Nick
Можно пояснить на моем примере?
https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/#perform-an-uncorrelated-subquery-with--lookup
Y
Nick
Можно пояснить на моем примере?
если есть связывание по идшникам, то это про https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/#perform-a-concise-correlated-subquery-with--lookup . там прям пример хорошо вам подходит
Алишер Абдуллаев
подскажите,
мне нужно получить данные по фильтру:
await Post.findOne({
'comment._id': 1,
'comment.active': true
'comment.deletedAt': { $eq: null }
})
--------
коллекция post:
{
_id: ObjectId("<id>")
comment: [
{
_id: ObjectId("1"),
creatorId: ObjectId("<id>"),
createdAt: ISODate
active: false,
deletedAt: ISODate
},
{
       _id: ObjectId("2"),
       creatorId: ObjectId("<id>"),
       createdAt: ISODate
       active: true,
       deletedAt: null
    },
]
}
-------
Я должен получить null, но я получаю:
{
_id: ObjectId("<id>")
comment: [
{
_id: ObjectId("1"),
creatorId: ObjectId("<id>"),
createdAt: ISODate
active: false,
deletedAt: ISODate
},
{
       _id: ObjectId("2"),
       creatorId: ObjectId("<id>"),
       createdAt: ISODate
       active: true,
       deletedAt: null
    },
]
}
Видимо ошибка в запросе. Но я явно указываю 'comment.active': true и
'comment.deletedAt': null.
Алишер Абдуллаев
Подскажите, где неправ ?
Алексей
может через $and надо объединить в query
Алишер Абдуллаев
Nick
Подскажите, где неправ ?
дело в том что формально условие выполняется, т.к. в массиве есть объект с таким ид, есть другой с актив, и есть с нулом. Т.е. все три услвоия выполнены.
В вашем же случае надо чтобы эти условия выполнялись именно внутри одного объекта, для этого надо использовать $elemMatch. Примеры: https://www.mongodb.com/docs/manual/reference/operator/query/elemMatch/#array-of-embedded-documents
Алишер Абдуллаев
Алексей
чем больше узнаешь про то как монга рабоатет тем больше понимаешь что лучше бы pg выбрал
Desalutar
Nick
Алексей
зачем сделали findAndModify и updateOne ?
Алексей
прочём в updateOne поддерживают операторы $add $power и т.д. а в findAndModify нет )
yopp
Возможно вас путает update vs update pipeline. Первое действительно сильно отличается от второго, так как в update pipeline доступны по сути все операторы агрегаций, кроме аккумуляторов
yopp
Думаю что findAndModify в далеком будущем ждёт замена на update pipeline
yopp
Фигме чтоб остаться на пг, но получить приемлемое шардирование пришлось изобрести mongos + csrs: https://www.figma.com/blog/how-figmas-databases-team-lived-to-tell-the-scale/
Алексей
Алексей
fenogentov
как в Studio 3T посмотреть логи монги?
fenogentov
fenogentov
в робо было
Асель
Всем привет!
Может кто подскажет, ситуfция такая:
Словили проблему при initial sync, сначала данные активно переливаются, по графикам это тоже видно:
Занимаемое место на диске растет, есть нагрузка на ЦПУ и тд, но в определенный момент переливка будто зависает, график по месту выходит на плато, нагрузка на ЦПУ падает, и в итоге это висит достаточно долго, пока мы не вылезем за пределы окна оплога.
По ресурсам вроде проходим...
Подскажите пожалуйста, куда можно покопать, чтобы понять, во что упираемся?
Надо синкануть 3ТБ, 4.4 community, на аналогичных дисках раньше 1 Тб переливался часа за 2
Тима $SNET
Добрый вечер, подскажите пожалуйста, если у меня есть в базе данных значение допустим с ключом TON, как мне обновить значение по ключу TON?
Использую Python
Тима $SNET
Какую команду использовать?
Nick
Anton
Подскажите существует группа по Realm ?
Anton
или тут можно задавать вопросы по Realm ?
Anton
Нуриддин
Бывает
Пол
Привет всем подскажите. Юзаю node js, mongoose, pm2 сервер работает на 3 кластерах. Недавно добавили watch (change stream) который срабатывает на изменения и отправляет данные на определеное апи. И вот потому что 3 кластера то отправляет 3 раза. Как побороть, может есть ссылка на что то такое
Nick
Пол
Nick
в доке монгуса вестимо
Nick
https://mongoosejs.com/docs/change-streams.html
хотя тут нет инфы про то как настраивать и похоже там это нормально должно изкоробки быть, тогда возможно бага и стоит задать вопрос на гитхабе у них либо повнимателнее посмотрите может в коде чегото лишнего добавлено
Y
Добрый день, подскажите, возможно ли в запросе фильтроваться по значению _id (type ObjectId) по ключу generation_time.
Пишу запрос, но он ничего не возвращает...
Семен
Я тут пытаюсь в бекенд и чет с порога меня гонят ссаными тряпками
Я скачал архив с сайта mongodb и пытаюсь вызвать open mongod
Он мне говорит, что не могу найти файл базы данных
Я ввобжу ему путь к директории, где его нужно создать
open mongod --dbpath /data/db
Теперь мне мак говорит, что я запускаю неправильными флагами, а я не догоняю что он от меня хочет
В доках все так запускают, ну или я краню жестко и не понимаю
Семен
Или я прям обязан ставить его через brew для мака?
Семен
Пока не знаю, просто когда ты видишь эти файлы перед глазами это проще
А когда они управляются пакетным менеджером внутри компа эта очевидность теряется
Да и в целом я пока по курсы пытаюсь двигатся, что бы tep by step поднятт, а уже потом смотреть другие варианты как оно лучше
Ибо если буут отличия между brew и инсталятором я потеряюсь точно
Семен
А в чем, собственно, проблема установить с помощью brew?
Хотя, оно и через brew не работает
Походу нужно снача читать доку по mac терминалу
Потом доку по mongodb
потом их гайды к конкретной версии
А уже потом только возврщаться к курсу((
Даже по гайду через brew оно не ставится((
Qwerty
Семен
А сам Homebrew установлен-то?
да, и обновлен
Он мне пишет, что No available formula with the name "mongodb". Did you mean mongosh or monetdb?
Мб я старый гайд читаю и теперь это не так называется, я хз
У них так много всего mongodb mongod еще какие-то штуки mongo****
Так можно долго перебирать все пакеты
Семен
No available formula with the name "mongodb-community@7.0"
Да не это гон, я ща все на свете буду так качать по их докам, а в итоге окажется, что надо было изначально ставить архив или делать это не с русского ip
Sergey spbsite
Семен
введи в консоль это
После установки подклбчился, но теперь надо понять что это вообще и где я нахожусь
По уроку они пытались поднять mongod а у меня подключение к mongosh
Видимо настало время читать все их доки если им конено можно верить ибо по 3м из них я так и не смог его установить, а тут рандомная команда от brew все запустила
Sergey spbsite
Семен
не рандомная
Имеется в виду в доках о ней не говорили и пояснений что это такое тоже нет
Brew её просто выдал и она заработала
Sergey spbsite
Семен
я сразу спрошу не отходя от кассы какие есть хорошие курмы на ютубе по монге?
Я же онобо еще не понимаю как она устроена и отличить хорошее от плохого смогу разве что с опытом, может вы знаете кого точно стоит посмотреть?
Мне же потом ее еще и деплоить надо будет хотелось бы к этому моменту быть уже в курсе всего проиходящего
Qwerty