Евгений
Приветствую! Такой вопрос, как лучше 1 вариант: ``` const OrganizationSchema = new mongoose.Schema( { // --- Владелец owner: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, }, // -- Настройки settings: { title: { type: String, required: true, }, inn: { type: Number, required: false, }, }, }, ); ``` ------- ``` 2 вариант: const Organization__Schema = new mongoose.Schema( { // --- Владелец owner: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, }, }, ); const Organization_Settings__Schema = new mongoose.Schema( { // --- Организация organization: { type: mongoose.Schema.Types.ObjectId, ref: 'Organization', required: true, }, // --- Наименование title: { type: String, }, // --- ИНН inn: { type: Number, }, }, ); ```
Евгений
То есть, суть вопроса заключается в чем: - Хранить все в одной схеме или лучше разбивать? Ибо получается, что при разбиение, в первой схеме только данные о владельце организации
Nick
То есть, суть вопроса заключается в чем: - Хранить все в одной схеме или лучше разбивать? Ибо получается, что при разбиение, в первой схеме только данные о владельце организации
если не будет переиспользования настроек одних и тех же в разных организациях то выносить их отдельно смысла почти ноль
Philipp
Ребят, помогите правильно составить агрегацию! Коллекция files, в каждом документе обязательно есть два поля важные для сортировки: project_id: str created_at: datetime Задача получить пагинированный список файлов, где они будут сгруппированы по проектам, проекты будут рассортированы по последнему созданному файлу, а внутри проекта, файлы должны быть отсортированы от самого последнего, до самого раннего. Я пока накумекал только: aggregation = [ { '$match': filtering }, { '$sort': {'project_id': 1, 'created_at': -1} }, { '$group': { '_id': '$project_id', 'latest_created_at': {'$max': '$created_at'}, 'files': {'$push': '$$ROOT'} } }, { '$sort': {'latest_created_at': -1} } ] Но тут получается, что в project_groups = await self.collection.aggregate(aggregation).to_list(length=None) мне надо выбирать все файлы в каждой группе, а затем на стороне Python уже нарезать по пагинации. Как-то это всё не так как хотелось бы... В идеале получить плоский список с нужным количеством документов, с пагинацией на стороне Mongo.
Philipp
Может как-то unwind использовать можно?
Yaroslav
Ребят, помогите правильно составить агрегацию! Коллекция files, в каждом документе обязательно есть два поля важные для сортировки: project_id: str created_at: datetime Задача получить пагинированный список файлов, где они будут сгруппированы по проектам, проекты будут рассортированы по последнему созданному файлу, а внутри проекта, файлы должны быть отсортированы от самого последнего, до самого раннего. Я пока накумекал только: aggregation = [ { '$match': filtering }, { '$sort': {'project_id': 1, 'created_at': -1} }, { '$group': { '_id': '$project_id', 'latest_created_at': {'$max': '$created_at'}, 'files': {'$push': '$$ROOT'} } }, { '$sort': {'latest_created_at': -1} } ] Но тут получается, что в project_groups = await self.collection.aggregate(aggregation).to_list(length=None) мне надо выбирать все файлы в каждой группе, а затем на стороне Python уже нарезать по пагинации. Как-то это всё не так как хотелось бы... В идеале получить плоский список с нужным количеством документов, с пагинацией на стороне Mongo.
Для выполнения вашей задачи с использованием MongoDB агрегаций, можно применить следующие шаги для сортировки и группировки, чтобы получить данные в желаемом формате с пагинацией на стороне MongoDB:Сначала необходимо отсортировать документы по created_at в порядке убывания.Затем, сгруппировать их по project_id, сохраняя массив файлов в порядке убывания.После этого сгруппированные данные снова сортируются по последнему созданному файлу в каждом проекте.Наконец, использовать $unwind для преобразования обратно в плоский список и добавить этапы для пагинации.Пример агрегации: aggregation = [ # Фильтрация документов по определенным критериям (опционально) { '$match': filtering }, # Сортировка документов по полю created_at в порядке убывания { '$sort': {'created_at': -1} }, # Группировка по project_id с сохранением отсортированного массива файлов { '$group': { '_id': '$project_id', 'latest_created_at': {'$first': '$created_at'}, 'files': {'$push': '$$ROOT'} } }, # Сортировка проектов по полю latest_created_at в порядке убывания { '$sort': {'latest_created_at': -1} }, # Преобразование сгруппированных данных обратно в плоский список { '$unwind': '$files' }, # Замена корневого документа на вложенный документ files { '$replaceRoot': {'newRoot': '$files'} }, # Пагинация (например, пропустить 10 документов и выбрать 10 следующих) { '$skip': 10 }, { '$limit': 10 } ] project_files = await self.collection.aggregate(aggregation).to_list(length=None)
Yaroslav
Вроде chagpt что-то норм выдает поттвоем вопросу
Philipp
Для выполнения вашей задачи с использованием MongoDB агрегаций, можно применить следующие шаги для сортировки и группировки, чтобы получить данные в желаемом формате с пагинацией на стороне MongoDB:Сначала необходимо отсортировать документы по created_at в порядке убывания.Затем, сгруппировать их по project_id, сохраняя массив файлов в порядке убывания.После этого сгруппированные данные снова сортируются по последнему созданному файлу в каждом проекте.Наконец, использовать $unwind для преобразования обратно в плоский список и добавить этапы для пагинации.Пример агрегации: aggregation = [ # Фильтрация документов по определенным критериям (опционально) { '$match': filtering }, # Сортировка документов по полю created_at в порядке убывания { '$sort': {'created_at': -1} }, # Группировка по project_id с сохранением отсортированного массива файлов { '$group': { '_id': '$project_id', 'latest_created_at': {'$first': '$created_at'}, 'files': {'$push': '$$ROOT'} } }, # Сортировка проектов по полю latest_created_at в порядке убывания { '$sort': {'latest_created_at': -1} }, # Преобразование сгруппированных данных обратно в плоский список { '$unwind': '$files' }, # Замена корневого документа на вложенный документ files { '$replaceRoot': {'newRoot': '$files'} }, # Пагинация (например, пропустить 10 документов и выбрать 10 следующих) { '$skip': 10 }, { '$limit': 10 } ] project_files = await self.collection.aggregate(aggregation).to_list(length=None)
Спасибо, я как раз искал что-то для вставки на рут документа.
Yaroslav
Мы плоский документы делаем через агрегацию и делаем $merge в новую коллекцию, это удобно тем, что пагницию и прочие манипуляции проще работать с плоскими списками
Philipp
О как =) Неужели его подкрутили? Помню, что последний раз, когда я его щупал, он страшную ересь выдавал...
Philipp
Gpt4o норм
Да из РФ, хрен оплатишь подписку...
Philipp
Мне приходится и PyCharm на fallback лицензии держать...
Yaroslav
Вообще можно оплачивать все эти вещи через различные сервисы. Но самы топ вариант. Взять отпуск, прилететь в Казахстан, сделать ИИН, сделать карту Каспи и все, оплачивайте сколько угодно.
Yaroslav
Да из РФ, хрен оплатишь подписку...
Можно попробовать ollama, она бесплатная
Philipp
Обязательно попробую, спасибо.
Yaroslav
Обязательно попробую, спасибо.
Вот кстати ее ответ aggregation = [ { '$match': filtering }, { '$sort': {'created_at': -1} }, { '$group': { '_id': '$project_id', 'latest_created_at': {'$max': '$created_at'}, 'files': {'$push': '$$ROOT'} } }, { '$sort': {'latest_created_at': -1} }, { '$unwind': '$files' }, { '$replaceRoot': {'newRoot': '$files'} }, { '$facet': { 'metadata': [{ '$count': "total" }], 'data': [{ '$skip': (page_number - 1) * page_size }, { '$limit': page_size }] } } ] project_groups = await self.collection.aggregate(aggregation).to_list(length=None)
Philipp
Хмм, не дурно. Ребята, кажется, я словил лёгкое вдохновенное предчувствие того, как меняется мир...
Ilya
Доброго дня. Может кто подсказать по тестированию индексов в монге? На проде несколько минут выполняется один запрос в коллекцию с 2+ млн записей. Составили индекс по некоторым полям, которые задействуются. Тестирую локально - новый индекс не используется, берётся один из старых по одному boolean полю. Но меня смущает, что у меня локально записей сильно меньше. Имеет ли смысл в таком случае экспериментировать с индексами до тех пор, пока они не начнут задействоваться локально или их эффективность можно будет увидеть только на проде? Монга версии 3.4.24. Пробовал наклепать 2млн записей локально - результат тот же, но записи отличаются только _id, что, наверное, может влиять, тут не знаю
Nick
Доброго дня. Может кто подсказать по тестированию индексов в монге? На проде несколько минут выполняется один запрос в коллекцию с 2+ млн записей. Составили индекс по некоторым полям, которые задействуются. Тестирую локально - новый индекс не используется, берётся один из старых по одному boolean полю. Но меня смущает, что у меня локально записей сильно меньше. Имеет ли смысл в таком случае экспериментировать с индексами до тех пор, пока они не начнут задействоваться локально или их эффективность можно будет увидеть только на проде? Монга версии 3.4.24. Пробовал наклепать 2млн записей локально - результат тот же, но записи отличаются только _id, что, наверное, может влиять, тут не знаю
Планировщик выбирает индексы по эвристикам, так что экпериментировать стоит. Можно потестить явное указание использования индекса через hint
deni
ребят, посоветуйте туториалы пж. Можно и на английском
Kvhqm
ребят, посоветуйте туториалы пж. Можно и на английском
Какой-то проект, который использует монгу в качестве бд
Nick
ребят, посоветуйте туториалы пж. Можно и на английском
туториалы на какую тему и какая цель? так проще всего начать с https://learn.mongodb.com/ и чтения документации
Ygor
ребят, посоветуйте туториалы пж. Можно и на английском
Раз уж ты не против инглища, то вот создание сайт используя mern. Сейчас сам изучаю мерн и заодно монгодб при помощи этого ролика https://youtu.be/4GUVz2psWUg
Abdurazzoq
Да, это проблема. У меня всего 32 ГБ памяти, система завершит процесс, когда он будет потреблять больше памяти.
У тебя в коллекциях настроен ли индексация? Если настроена, то отправляешь ли ты все запросы правильно, то есть по индексу? Насколько большая самая большая документ
Александр
Привет народ. Поставил MongoDB на Devuan. Cтавлю как написано тут. Дошел до момента с запуском, то что systemd нету с этим всё всё понятно. Просто пишу в консоль mongod и в ответ прилетает чтото похожее на json/
Александр
Подскажите как её правильно запускать?
Aleksey
День добрый Сори за оффтоп, но подскажите пожалуйста тг каналы по брокерам (кролик, кафка) 😇
Mark
Looking for mongodb expert
Mark
Hello
Viktar
Looking for mongodb expert
Hi. Please describe your issue and someone will help you
robi
Как считаете есть смысл выкупить данные после взлома (READ_ME_TO_RECOVER_YOUR_DATA)? Или скорее снова обманут?
Артем
Скинули скрин, что данные есть
Хм, а сколько просят? У меня просто просили оч много, я из бэкапа восстановился и все))
Артем
400$
если данные важны, то можешь попробовать сторговаться до 200$ (мол половина, а после данных вторая), а потом кинуть)
robi
хм, попробую через гаранта договориться
vaillant.exe
Если не секрет, чтоб ошибок не повторить
robi
открыл на беке remote connect, чтобы с локалки бд чекнуть через компас
robi
просыпаюсь, бд всю снесли
vaillant.exe
Печаль
robi
vaillant.exe
Я последнее время все через гаранта делать буду, студию разработки и дизайна, так-же рекламных моментов и тех.поддержки открываю. Образно говоря бизнеса под ключ человеку, от физического дизайна интерьера до цифрового. И вот тоже думаю что везде нужен гарант.
vaillant.exe
Иначе это фигня выйдет, если с моей страны - то контракт, если с другой - гарант.
vaillant.exe
заскамили, не пытайтесь вернуть
Печаль, ты без гаранта пробовал ?
vaillant.exe
Да
Бля…
Александр
Привет народ! Подскажите нормальную либу для работы с монгой на питоне?
Александр
pymongo же
ага, уже
Дмитрий
Привет народ! Подскажите нормальную либу для работы с монгой на питоне?
Можно посмотреть в сторону beanie/bunnet, если хотим унифицированные модели
Александр
спасибо парни, на пока мне мотора и пимонги хватит
Александр
Народ подскажите, в запросе может быть 2 условия? например мне надо выбрать группу доков командой find чтобы 1<= x < 10
Александр
И еще подскажите в доках по пимонге написано что можно создать индекс, а в доках по мотору не нашёл. Можно ли для мотора создать индекс?
Nick
Народ подскажите, в запросе может быть 2 условия? например мне надо выбрать группу доков командой find чтобы 1<= x < 10
дв, делается через комбинацию $and и $or для формирвоания сложного лоигческого услвоия в вашем случае можно проще (ниже уже привели пример)
Александр
а про индекс что-нибудь подскажете?
Iwjsjjrehwu
И еще подскажите в доках по пимонге написано что можно создать индекс, а в доках по мотору не нашёл. Можно ли для мотора создать индекс?
так это всего-лишь драйвер, он никак не влияет можешь ли ты создать индекс/не можешь. как раз мотор обертка над pymongo, там точно такие же методы
Aleksandr
Привет всем, подскажите как выглядят коллекции чата один на один?
Nick
Привет всем, подскажите как выглядят коллекции чата один на один?
как сделаете) а по сути уточняйте что подразумеваете под "один на один"
Aleksandr
Один пользователь общается только с другим, просто интересно как это, через вложенности или разные коллекции делается
Nick
Один пользователь общается только с другим, просто интересно как это, через вложенности или разные коллекции делается
если прям просто то коллекция для юзеров и коллекция для сообщений. Если нужно еще хранить инфу о самом чате, например кто создал и когда, или например название чата если хочется дать возможность юзерам делать несколько чатов между собой с разной историей - то еще коллекция для чатов. Структуры от потребностей
Nick
если юзеры испльзуют внешние какито идентификаторы и нет необходимости самому их менеджерить то можно и без нее обойтись
Егор
Добрый день. Какие материалы по монге изучить можно?
Алексей
Всем привет! Подскажите пожалуйста по следующему вопросу, потребовалось сделать дамп и восстановить на соседнем сервере БД (объемная 300+ Гб) сделал дамп следующей командой mongodump --ssl --host ХОСТ -d БД --gzip --numParallelCollections 16 --archive=ИМЯ_АРХИВА.gz --username ******* --authenticationDatabase ****** дамп делался долго, ~3 дня Восстанавливаю БД следующей командлетой (архив .gz предварительно положил рядышком на конечный сервер, где и будет жить БД) mongorestore --drop --ssl --host ХОСТ --gzip --archive=/ПУТЬ/ИМЯ_АРХИВА.gz --username ******* --authenticationDatabase ******* На протяжении нескольких дней в логах следующая картина Время | Название коллекции | размер В логах ошибок по восстановлению - нету. Выглядит это вот так как на скрине. По ошибка я запустил восстановление без —verbose и мне непонятно что происходит. У меня два вопроса: 1. можно ли как то понять сколько осталось по времени восстановлению БД? 2. Допустимо ли из dump архива просто подменить исходные файлы БЕЗ mongorestore?