Yaroslav
Теоретически можно добавить 3.4 к 4.0, но зачем? Обновите. Тем более, если хотите добавить, значит данных там нет.
нет просто на проде версия 3.4 . было принято решение обновить версию и сделать реплика сет. Я думал сделать down time . снять бэкап . развернуть реплика сет и накатить бэкап и потом запустить все . но мне сказали что такое не кто не даст сделать )) Вот и пытаюсь понять и придумать что в таком случае мне делать
Yaroslav
Точнее я хз как такие ситуации разруливаются и какие есть бест практис
AstraSerg
Точнее я хз как такие ситуации разруливаются и какие есть бест практис
Прежде всего разделите эти 2 шага: сначал обновите, а потом репликасет сделаете простым добавлением нод к этой
AstraSerg
AstraSerg
но такая остановка займёт значительно меньше времени, чем по вашему плану
AstraSerg
селекты по 100м коллекции с $ne занимают несколько миинут
так а не получается сделать фильтр на предыдущем стейдже?
Bro
просто .find().sort().limit() нет аггрегации
AstraSerg
просто .find().sort().limit() нет аггрегации
Может имеет смысле перейти на агрегацию? Случаи конечно разные есть, но в некоторых - это оправдано
Bro
я могу ошибаться но мне кажется аггрегация будет работать точно так же
Bro
просто вместо find() будте {$match: {...}}
Bro
ну и тд
AstraSerg
я могу ошибаться но мне кажется аггрегация будет работать точно так же
не исключено. Суть не втом что бы просто перейти на агрегация, а втом что она позволит вам модифицировать запрос
Bro
там 100м документов где-то есть поле removed: True но в большей части этого флага нет
Bro
и селект документов где 'removed': {'$ne': True}
Bro
может Sparse index попробовать
Bro
only contain entries for documents that have the indexed field, even if the index field contains a null value. The index skips over any document that is missing the indexed field. The index is “sparse” because it does not include all documents of a collection.
AstraSerg
там 100м документов где-то есть поле removed: True но в большей части этого флага нет
вот тут можно как раз и оптимизировать: сначала, на первом стейдже отбросьте доки где removed: true, а потом остальное
AstraSerg
может Sparse index попробовать
да, конечно, он как раз для таких случаев
Bro
отбросить доки где removed: true это и будет 'removed': {'$ne': True}
Nick
а можно попродробнее почему нельзя просто взят ьи искать по eq: false?
yopp
здравствуйте, Товарищи монговоды ! есть инстанс монги версия 3.4 есть реплика сет 4.0 Могу ли я добавить инстанс монги в реплика сет и назначить этот инстанс primary нодой без остановки этого инстанса и реплика сета, на горячую короче ?
Нет. Во-первых внутри кластера могут быть только соседние минорные версии (с 4.0 только 3.6) Во-вторых, если на ноде уже существуют данные то они не будут «смержены» с кластером
Bro
В большей части документов
Nick
а индекс по полю есть?
AstraSerg
Потому что этого поля нет.
может просто проверить $exist ?
Bro
Есть
Nick
он не спаршенный?
Nick
sparse
Bro
Нет
Bro
Я вот думаю сделать спаршеный
Nick
тогда попробуйте как и сказали выше $exists: false
Yaroslav
но такая остановка займёт значительно меньше времени, чем по вашему плану
да думаю так и сделаю : сначало обновлю версию монги , потом прицеплю к ней реплики . осталось разобраться только как в реалиях кубере это все осуществить , спасибо !
AstraSerg
да думаю так и сделаю : сначало обновлю версию монги , потом прицеплю к ней реплики . осталось разобраться только как в реалиях кубере это все осуществить , спасибо !
и это правильно. Тем более, что @dd_bb говорит, что только соседние версии поддерживаются, а у вас пред-предыдущая (3.6 ещё была)
Yaroslav
и это правильно. Тем более, что @dd_bb говорит, что только соседние версии поддерживаются, а у вас пред-предыдущая (3.6 ещё была)
ага , вот только моги ли я просто обновить версию монги и указать старый db/path ? Данные не повредется из за этого ? или надо снимать дампы и раскатывать ?
Bro
Я бы сделал бэкап
Bro
На всякий случай
AstraSerg
ага , вот только моги ли я просто обновить версию монги и указать старый db/path ? Данные не повредется из за этого ? или надо снимать дампы и раскатывать ?
бакап конечно нужен, данные повредится не должны, просто следуйте инструкциям обновлениея: https://docs.mongodb.com/manual/release-notes/3.6-upgrade-standalone/
ep4sh
Допустим я аггрегировал две коллекции: db.issue.aggregate([{ $lookup: { from: "renter", localField: "org", foreignField: "org", as: "company" } }]); На выходе: { "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920, "company" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }Как теперь к этому объекту обратиться?
ep4sh
ЭЭЭ) прям тупняк
ep4sh
ровно как и вопрос наверн, сейчас переформулирую
ep4sh
Я хочу чтобы на выхлопе у меня было { "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : "Sun", "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920 }Как будто я сделал JOIN Потом, все это дело в JSON отдал бы фронтенд разработчику (опять же себе😂😂 ) Реально? или я дофига хочу
ep4sh
> db.renter.find(); { "_id" : ObjectId("5ba24a44103b0ac162148f70"), "company" : "Microsoft", "floor" : 2, "org" : 1 } { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } > db.issue.find(); { "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920 }
ep4sh
это был набор букв для меня, но я разберусь)
ep4sh
https://docs.mongodb.com/manual/reference/operator/aggregation/project/
ep4sh
это?)
AstraSerg
это?)
это
ep4sh
Спасибо)
AstraSerg
ща набросаю...
AstraSerg
Типа такого: {$project: {name: 1, floor: 1, cardNo: 1,dateIn: 1, dateOut:1, org: '$company[0].company'}} Это добавьте как следующий стейдж после лукап
Petro
как покдлючиться к базе если в ссылке +srv через studio 3t?
ep4sh
Супер)))
ep4sh
правда $company[0].company' не работает(
Anonymous
правда $company[0].company' не работает(
А если вот "$company.0.company"
ep4sh
А если вот "$company.0.company"
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "cardNo" : 34443, "org" : [ ] }
ep4sh
пустой список
Anonymous
пустой список
db.users.aggregate([ { $project: { name: 1, first: { $arrayElemAt: [ "$favorites", 0 ] }, last: { $arrayElemAt: [ "$favorites", -1 ] } } } ])
Anonymous
На вашом случай $favorites это company
ep4sh
понял, спс то есть обращение также, через список, попробую
ep4sh
Я добил
ep4sh
db.guest.aggregate([ { $lookup: { from: "rent", localField: "org", foreignField: "org", as: "company" } }, { $project: { name: 1, floor: 1, cardNo: 1, org: "$company.company" } } ]).pretty();
AstraSerg
Но обратите внимание, что если отношение issue.org к renter.org не один к одному, то нужно использовать еще и $unwind
ep4sh
Отлично, поздравляю!
Смущает только что возвращается список org: [ “sun”], ноооо, думаю потом это можно обыграть
ep4sh
Это потому что вы берете $company.company вместо $company.0.company
При таком запросе - возвращает пустой список(
AstraSerg
При таком запросе - возвращает пустой список(
Так, покажите еще раз пример документа, сразу после лукап, без проджекта
AstraSerg
В прошлый раз вы говорили что в нем company - это список документов
AstraSerg
Нулевой элемент этого списка - это отдельный документ, одним из ключе которого является company
AstraSerg
А value этого ключа, как раз нужное вам название, Sun
ep4sh
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920, "company" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }
ep4sh
Если делаю с нулём:
ep4sh
> db.guest.aggregate([ ... { ... $lookup: { ... from: "rent", ... localField: "org", ... foreignField: "org", ... as: "company"... } ... }, ... { ... $project: { ... name: 1, ... floor: 1, ... cardNo: 1, ... org: "$company.0.company", ... dateIn: 1, ... dateout: 1... } ... } ... ]).pretty(); { "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "cardNo" : 34443, "dateIn" : 20180919, "org" : [ ] }