critskiy
оок
yopp
И посмотрите нет ли затыков в этот момент в других коллекциях
yopp
Если у вас атлас, ещё можете посмотреть в cache activity
yopp
Вполне может быть что у вас проблема локализуется в одной коллекции, например потому что в какой-то момент кеш дистабилизируется. Например приезжает толстый запрос
critskiy
Хорошо, спасибо
Nikolay
Всем привет, вопрос - делаю рестор базы с флагом noIndexRestore (~140 ГБ) на другом сервере, рестор еще не кончился, а размер базы уже 300 ГБ. Ознакомился с подобным вопросом https://stackoverflow.com/questions/32665131/cant-figure-out-why-mongo-database-becomes-bigger-after-migration и не могу понять, почему у меня восстановленная база такая огромная выходит
Nikolay
Офигенно, уже 428 ГБ занимает база. Чем дальше тем страшнее
Anonymous
Движок хранилища и алгоритм сжатия одинаковый с источником?
Nikolay
А драйв на скок
облако, documentdb
Nikolay
Движок хранилища и алгоритм сжатия одинаковый с источником?
вот с этим хз, апишка немного отличается, 3.6.2 на старой, на новой 3.6.0
Anonymous
Storage Compression Amazon DocumentDB doesn't currently support compression for stored data or indexes. Data sizes for stored data and indexes might be larger than when you use other options.
Anonymous
А в монге 3.6 по умолчанию snappy, а можно еще сильнее сжать с zlib.
Nikolay
Понятно, у меня теперь другая трабла, посущественнее, названия коллекций в лимит уперлись Collection name must be between 1 and 57 bytes Неужели придется переименовывать все коллекции больше 57 байт?
Anonymous
Если это ограничение их БД видимо да, переписывать приложеньки, переименовывать коллекции... или можно вместо documentDB воспользоваться монговским атласом, таких проблем там вероятно не будет)
Nikolay
А черт знает, я не дба, просто вижу, что в нашей бд идет имя коллекции, потом огромный хэш
Алексей
все добрый день
Алексей
наблюдаю индекс билд в статус службы
Алексей
это нормально
Nikolay
bla_bla_огромныйхэшнасороксимволов_таск - такая маска
Nick
упорото
Nikolay
я уже связался с разрабами, сказали что это какие-то тестовые данные, и сейчас все укладывается в 47 символов
yopp
облако, documentdb
DocumentDB это не монга. У вас будут большие проблемы с совместимостью и поддерживать эти проблемы смогут только люди из амазона
yopp
Наверху посоветовали атлас, если вы хотите managed решение
Nikolay
какие подводные камни в использовании documentdb, кроме лимитов?
yopp
В совместимости
yopp
Это не монга, это моего-подобный интерфейс к амазоновскому хранилищу. Слово «подобный» тут ключевое, что означат что они не гарантируют совместимости и поддержки всех фич из монги
Андрей
В доке написано в опции для конекта socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity , что будет по истечении времени ?
Nikolay
А из архивированного дампа монги можно извлечь файлы в json? В доке не вижу такой возомжности
Alexey
Друзья, привет. В выводе rs.status() поле lastHeartbeat с актуальной датой свидетельствует о том, что узел в порядке и доступен?
Alexey
Или не факт?)
Nikolay
Да, но руками
как? Гзипом я пройдусь а дальше как? У меня задача сейчас исключить из рестора несколько коллекций, при архивированном дампе флаг —excludecollection будет работать?
yopp
А зачем вам json?
Nikolay
снес бы этот файлик коллекции
yopp
nsExclude должен работать с любым из форматов
Nikolay
ок, пробую
Nikolay
Ха, уже наткнулся на первый камень в виде невозможности шринкануть коллекцию Feature not supported: compact
а
Привет, а здесь можно задать вопрос связанный с java/spring data/Mongo?
yopp
Попробуйте :)
а
Привет. 1) Можно ли из апликухи создать view в монге (db.createView())? Спринг дата, монго драйвер 3.8 (мб mongotemplate умеет) И если да, то как правильно это делать? Если более развернуто - а вообще норм идея реализовать софт делит через вьюху, в которой записи ток с deleted:false (чтобы не кастомизироаать запросы - спрингдата даёт из коробки)? Индексы там от родной коллекции судя по доке. Или же это плохая идея? (And why) 2) тоже спринг дата и монго. Есть set<optionsDocument> в документе userDocument. Если вешать (юзать) @DBRef до поры до времени все ок, пока не захочется сделать аггрегацию по содержимому optionsDocument... Да и умные люди пишут что надо юзать мануал референс (т.к. есть рестрикшнв по дбреф)? Как это реализовывать? Делать set<objectId> и все методы спринг даты (find/findall)вручную переписывать на аггрегации? Или можно просто тоже аноташку навесить? А норм будет оставить set<optionsDocument> и хранить там сразу все данные (ембед реф это называется вроде или как..) ПЛЮС в отдельной коллекции ТОЖЕ хранить optionsDocument (в примерах доки такой вариант не рассматривался) и если optionsDocument изменится - у всех юзеров его тоже менять (1 option это по сути список прав с именем, который может меняться, я полагаю меняться будет редко, добавляться чаще, но последнее нас не аффектит), а при создании/изменении юзера чекать по айди все ли поля совпадают с option в юзере и в своей коллекции (поля у опшн всего два-имя и список прав). Сори если несу дичь парни, но от помощи не откажусь :3
а
Пробую
Alexey
Привет, народ! Поднимаю монгу в докер-контейнере, указываю кейфайл, а он говорит, что bad file. В атрибутах mongod root 1024. В чем может быть проблема?
Alexey
Обычная монга прямо сейчас работает с этим файлом. Этой то что не нравится...
Ruslan
Какой имейдж монги используешь? latest?
Ruslan
Ну и /data/keyfile.txt в контейнер кладешь, ведь?
Alexey
Ну и /data/keyfile.txt в контейнер кладешь, ведь?
Я делаю так: -v /mnt:/data, а в /mnt у меня лежит keyfile.txt
Ruslan
Нужно убедиться, что: 1. в /data/ лежит keyfile.txt (запусти /bin/sh, например). 2. У keyfile проставлены корректные права.
Alexey
Нужно убедиться, что: 1. в /data/ лежит keyfile.txt (запусти /bin/sh, например). 2. У keyfile проставлены корректные права.
Для keyfile делал 777. Не помогло. По поводу того, чтобы убедиться - читал на просторах, что вместо создания файла, докер создает директорию. Советовали использовать —mount. Что скажешь?
Ruslan
-v /mnt:/data должно хватить. В любом случае тебе нужно зайти внутрь контейнера. Примерно так: docker run -v /mnt:/data/mnt -it mongo:4.2.1-bionic /bin/sh Затем перейди в /data/mnt и посмотри, что там лежит твой keyfile с нужными правами Потом перепиши путь в конфиге с /data/keyfile.txt на /data/mnt/keyfile.txt и запускай монгу
yopp
Привет. 1) Можно ли из апликухи создать view в монге (db.createView())? Спринг дата, монго драйвер 3.8 (мб mongotemplate умеет) И если да, то как правильно это делать? Если более развернуто - а вообще норм идея реализовать софт делит через вьюху, в которой записи ток с deleted:false (чтобы не кастомизироаать запросы - спрингдата даёт из коробки)? Индексы там от родной коллекции судя по доке. Или же это плохая идея? (And why) 2) тоже спринг дата и монго. Есть set<optionsDocument> в документе userDocument. Если вешать (юзать) @DBRef до поры до времени все ок, пока не захочется сделать аггрегацию по содержимому optionsDocument... Да и умные люди пишут что надо юзать мануал референс (т.к. есть рестрикшнв по дбреф)? Как это реализовывать? Делать set<objectId> и все методы спринг даты (find/findall)вручную переписывать на аггрегации? Или можно просто тоже аноташку навесить? А норм будет оставить set<optionsDocument> и хранить там сразу все данные (ембед реф это называется вроде или как..) ПЛЮС в отдельной коллекции ТОЖЕ хранить optionsDocument (в примерах доки такой вариант не рассматривался) и если optionsDocument изменится - у всех юзеров его тоже менять (1 option это по сути список прав с именем, который может меняться, я полагаю меняться будет редко, добавляться чаще, но последнее нас не аффектит), а при создании/изменении юзера чекать по айди все ли поля совпадают с option в юзере и в своей коллекции (поля у опшн всего два-имя и список прав). Сори если несу дичь парни, но от помощи не откажусь :3
1) зависит от того, насколько эффективен индекс по deleted. В остальном почему бы и нет 2) не совсем понятно. Если без спринга, какая у вас схема в итоге? В документе пользователя есть массив документов с опциями?
а
UserDocument: id: ObjectId.. roles: Set<RoleDocument> RoleDocument: id: ObjectId.. rights: Set<String>
а
Если схематично вкратце
yopp
Ага. А какую задачу вы решаете?
Alexey
Блин, файл на месте. А права какие должны быть? Извини, если туплю, я с линуксом не так давно знаком)
Alexey
Покажи ls -la
rw bin root 1024
Alexey
А должно быть видимо mongod
Alexey
Хм. Может мне из хостовой системы дать права на /mnt/keyfile.txt для пользователя bin?
Ruslan
drwxr-xr-x 2 mongodb mongodb 4096 Nov 1 00:35 keyfile.txt Должно быть как-то так
Ilya
UserDocument: id: ObjectId.. roles: Set<RoleDocument> RoleDocument: id: ObjectId.. rights: Set<String>
Реализуете ролевой контроль доступа?) Пару недель назад точно такую же систему пилил, правда использовал не spring, а mongoose, так как пишу на ноде. Я в поле role вписывал ObjectID документа роли, которой обладает пользователь. При запросе делал $lookup (populate для mongoose), что, насколько я понимаю, является аналогом JOIN-а для реляционных бд. Все запросы идут очень быстро, ведь для ObjectID делается индекс по умолчанию.
а
Нужно правильно организовать связь user-role roles: Set<DBRef> (у меня в коде Set<RoleDocument>) roles: Set<ObjectId> roles: Set<RoleDocument> 1) C первым все ок. Мой драйвер успешно тащил при findAll все что нужно + я слыхал там даже lazy есть теперь у DBref Но мне понадобилось (задача Х) отфильтровать findAll users по rights, которые в роли. Как я понял с DBRef это не сделать (по крайней мере малой кровью). 2) С Set<ObjectId> (manual reference) я наколбасил такую штуку db.ucars_user.aggregate([{ "$lookup": { "from": "role", "localField": "rolez", "foreignField": "_id", "as": "rolezz" } }, {"$project": {"rolezz": 1}},{ "$match": {"rolezz": { "$elemMatch": { "name": { "$eq": "role3"}}}}}]) И она делает то что мне надо - (задача Х) (ну в запросе названия role rolezz в зав-ти от названий коллекций и поля у юзера) И это работает. Но при findAll users мне придется как-то доставать для каждого юзера роли (с Set<ObjectId> ходить за реальными ролями). Это тоже аггрегацией решается наверно. То есть мне придется пистаь кастомный запрос findAll, а до этого все из коробочки делалось springData (ну тоже с lookup) Не хочется писать слишком мнго кастомных запросов 3) И что я решил сделать, не знаю верно ли это Сделать в users целый Set<RoleDocument> То есть хранить и айдишник и Set<String> (rights) Но при этом все равно иметь отдельную коллекцию RoleDocument (для своих целей) Минус в том, что при edit RoleDocument элементов придется проходиться по коллекции users (allusers) и там менять RoleDocument чтобы они соответствовали тем, что в коллекции RoleDocument. То есть если было UserDoc: id: 1 roles: { Role1: {right1,right2} } RoleDoc: id: 1 rights: {right1, right2} И мы решили сделать RoleDoc: id: 1 rights: {right1} Придется пройтись по всем юзерам и вручную у них roles: { Role1: {right1,right2} } >>> roles: { Role1: {right1} } И при вставке нового юзера проверять что rights: Set<String> с id=Y тоже соответствует Set<String> в коллекции RoleDocument с id=Y. Таким образом мне не придется имплементить заного findAll/find итд для юзера, чтобы он $lookup зависимость... Так как updateRole операция редкая, а при вставке юзера проверить соответствие не оч трудно, вроде норм? или лажа все равно и надо брать пункт 2 с lookup на каждый чих?))))
Ilya
Да, но каждый запрос надо будет писать с кастомным $lookup итд. да?
Если вы хотите делать запрос по пользователям и соответствующим им ролям, то да. Но повторюсь, лично я использовал иструмент populate, который сильно облегчает работу с линковкой.
Marshal
Всем привет. Первый раз использую монго в своем проекте. Использую mongoengine. Подскажите пожалуйста, что делать с старыми данными, когда я изменил тип поля модели с стринг на инт? Написать скрипт для миграции старых данных?
Ilya
Нужно правильно организовать связь user-role roles: Set<DBRef> (у меня в коде Set<RoleDocument>) roles: Set<ObjectId> roles: Set<RoleDocument> 1) C первым все ок. Мой драйвер успешно тащил при findAll все что нужно + я слыхал там даже lazy есть теперь у DBref Но мне понадобилось (задача Х) отфильтровать findAll users по rights, которые в роли. Как я понял с DBRef это не сделать (по крайней мере малой кровью). 2) С Set<ObjectId> (manual reference) я наколбасил такую штуку db.ucars_user.aggregate([{ "$lookup": { "from": "role", "localField": "rolez", "foreignField": "_id", "as": "rolezz" } }, {"$project": {"rolezz": 1}},{ "$match": {"rolezz": { "$elemMatch": { "name": { "$eq": "role3"}}}}}]) И она делает то что мне надо - (задача Х) (ну в запросе названия role rolezz в зав-ти от названий коллекций и поля у юзера) И это работает. Но при findAll users мне придется как-то доставать для каждого юзера роли (с Set<ObjectId> ходить за реальными ролями). Это тоже аггрегацией решается наверно. То есть мне придется пистаь кастомный запрос findAll, а до этого все из коробочки делалось springData (ну тоже с lookup) Не хочется писать слишком мнго кастомных запросов 3) И что я решил сделать, не знаю верно ли это Сделать в users целый Set<RoleDocument> То есть хранить и айдишник и Set<String> (rights) Но при этом все равно иметь отдельную коллекцию RoleDocument (для своих целей) Минус в том, что при edit RoleDocument элементов придется проходиться по коллекции users (allusers) и там менять RoleDocument чтобы они соответствовали тем, что в коллекции RoleDocument. То есть если было UserDoc: id: 1 roles: { Role1: {right1,right2} } RoleDoc: id: 1 rights: {right1, right2} И мы решили сделать RoleDoc: id: 1 rights: {right1} Придется пройтись по всем юзерам и вручную у них roles: { Role1: {right1,right2} } >>> roles: { Role1: {right1} } И при вставке нового юзера проверять что rights: Set<String> с id=Y тоже соответствует Set<String> в коллекции RoleDocument с id=Y. Таким образом мне не придется имплементить заного findAll/find итд для юзера, чтобы он $lookup зависимость... Так как updateRole операция редкая, а при вставке юзера проверить соответствие не оч трудно, вроде норм? или лажа все равно и надо брать пункт 2 с lookup на каждый чих?))))
Когда я приступал к реализации ролевого контроля доступа, то тоже поначалу хотел хранить роль просто в документе пользователя. Но я крайне не рекомендую подобный подход, потому что в дальнейшем он череват большой головной болью. Просто подумайте, что придется сделать, если роли будут изменяться, удаляться, добавляться. Сменилось название роли - надо пробежаться по всем и у всех поменять. Добавился новый permission в роль - добавить у всех. Решили добавить новое поле в документ роли (к примеру, помимо названия роли может быть её написание на русском, к примеру admin - Администратор, также можеть быть описание роли, и.т.д.) - опять же обновлять у всех. С удалением точно также. Принцип простой - разные коллекции для разных сущностей. Насколько я знаю, aggregation framework хорошо работает с подобными запросами. Вы ведь вполне можете протестировать производительность запросов по заданным условиям - вставте сколько необходимо документов пользователей с ролями в базу, и погоняйте запросы, замеряя время их выполнения. Я уверен, что если все сделать правильно, система будет работать хорошо и быстро.
а
Спасибо за ответ, возможно перейду на кастомные квери тогда..
а
@dd_bb что думаете?)
Alexey
Господи, теперь у него unable to determine status of lock file
Alexey
До этого было unable to acces to read-only directory
Alexey
Alexey
Ненавижу линукс