Bro
оооо. плохо
yopp
это меньшая из проблем
yopp
угадать шард ключ, организовать резервное копирование, подобрать оптимальную топологию кластера
yopp
вот это проблемы :)
yopp
и теперь это всё с тремя терабайтами, в продакшене, небось ещё и без существеного даунтама, да? :)
Igor
Здравствуй, монгочат. Я страдаю.
У меня есть документ:
{
"_id" : 1.0,
"role_permissions" : [
["role1", ["perm1", "perm2"]],
["role2", ["perm3", "perm4"]]
]
}
Я хочу удалить, к примеру, вот это:
["role1", ["perm1", "perm2"]]
Но я не знаю какие именно могут быть permissions в [1]. Поэтому я пишу что-то такое:
db.originRuleSet.update(
{'_id': 1},
{
'$pull': {
'role_permissions.$.0': 'role1'
}
}
)
А оно не работает :(
При этом похожие примеры работают в случае если в nested arrays валяется object.
yopp
поменяйте схему на массив документов
yopp
role_permissions: [
{name: "role1", permissions: ["a", "b"]},
{name: "role2", permissions: ["a", "b"]}
]
yopp
с чего это баг
yopp
$ это positional оператор от $elemMatch
yopp
которого у вас в запросе не видно
Igor
Окей, я кажется понял. Видимо этот массив должен быть куском запроса. Пойду курить мануал дальше. Спасибо
yopp
поменяйте схему
yopp
эта схема — очень неэффективная и будет доставлять вам _очень_ много боли
yopp
массивы и объекты в bson это одно и то-же
Igor
Уже попробовал, там всё равно трабла была в The positional operator did not find the match needed from the query. Прошёл в гугле по выхлопу, что-то понял
yopp
разница только в том, что в массиве ключи это индексы элементов
yopp
да, вам в любом случае нужен будет $elemMatch чтоб найти совпадение внутри массива
yopp
но вместо игры угадай индекс, будет явно видно название ключа
yopp
плюс можно будет нормально индекс сделать
yopp
yopp
nested array это ужасный выбор в среднем
yopp
который примерно такой-же неэффективный как динамические имена ключей
yopp
Igor
Эх, короче буду переписывать пачку запросов уже готовых.
yopp
yopp
по массиву скаляров есть $jsonSheme и uniqueItems, а значит если _сильно_ надо и по другому задача не решается, можно продублировать поля на которых надо гарантировать уникальность в отдельный массив и это поле валидировать
Igor
В общем, запрос правильный, по всей видимости, выглядит так:
db.originRuleSet.updateOne(
{'_id': 1, 'role_permissions': {'$elemMatch': {'role_name': 'role1'}}},
{
'$pull': {
'role_permissions': {
'role_name': 'role1'
}
}
}
)
Igor
У меня есть ещё 1 вопрос не в кассу. Вот что я тут делаю этими апдейтами и прочим. Если я знаю заранее, что там будет очень мало апдейтов и записей, мб имеет смысл юзать локи и тупо реплейсить документ?
Но с локами есть трабла: их завезди недавно, в используемой монге их нет. Как быть с блокировками, распраделёнными блокировками? Тащить etcd, zookeper и прочее не очень хочется. Мемлок будет работать только на 1 инстанс.
Как вообще с этим живут монговоды?
yopp
зачем вам блокировка?
Igor
зачем вам блокировка?
Чтобы избежать race condition на обновлении. Просто кажется, что чем патчить данные такими запросами, проще обновить это руками и просто перезаписать объект
yopp
вы пытаетесь забивать гвоздь ядерным реактором
yopp
который ещё надо построить
yopp
если вам ради обновления надо тащить etcd или ещё какой-то zookeper вы где-то в своей архитектуре сильно не туда свернули
Igor
вы пытаетесь забивать гвоздь ядерным реактором
Окей, то есть вот все эти запросы такого вида с вложенностями — это нормально для мира монги?
(я просто исследую варианты, потому что монгу я открыл ковырять вчера, потому что меняю работу, а у них монга)
yopp
да, вполне
Igor
Окей, тогда буду дальше ковырять, надеюсь привыкну. Спасибо
Nick
Bro
Igor
Nick
вопрос больше как вы планировали использовать, может вы упускаете какието базовые монговские механики и вам бы явно проэто сказали, а не просто что не нужны локи
Nick
инстанс приложения?
Igor
Igor
Если мне память не изменяет, монга у них 3.6
Gor
@dd_bb привет. А ты не знаешь, почему текстовый индекс первым переносят в планировщике ?
yopp
не знаю. могу предположить чтонибудь в духе «не умеет пересекать с разными типами индексов»
Gor
yopp
можно попробовать хинтовать индексы
yopp
ну вот и ответ :)
Gor
Ну не совсем, я внутренности тут колупаю. Нарыл забавное
Gor
Фильтр на негативные термины делается только после Фетч документа
yopp
по этому hint и не доступен
Gor
Точнее там вообще фильтр на фразу и термины после того как найдены все документы, закачаны в память и только потом планировщик фильтра текста
yopp
текстовые индексы это очень сложно
Gor
Вот напрашивается переструкторирование планировщике задач, когда делается stage_andhash и stage_or на основе парсинга search терминов и только после этого уже передавать на fetch
yopp
блеймом найти тех сейчас чаще всего поддерживает текстовые индексы и с ними сначала поговорить
yopp
можно начать с тикета в жире
Gor
yopp
ну если их там уже пачка, то начинать диалог в одном из них
yopp
посмотреть на кого заассайнены
Gor
С 15 года
yopp
там веорятно всё очень непросто. я не ковырял монговский текстовый индекс, даже не особо представляю какая там реализация
Gor
Хотя были push up в прошлом
Gor
yopp
сомневаюсь тогда что за три года стало меньше переписывать ;)
yopp
btree по чему?
yopp
по нормализованным словоформам?
Gor
yopp
оно рубит текст по токенам, нормализует и делает ссылки из индекса на каждый токен?
Gor
Оно рубит текст на токену и делает ссылку на документ