Nick
Alikhan
Евгений
Приветствую! Такой вопрос, как лучше
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
О как =) Неужели его подкрутили? Помню, что последний раз, когда я его щупал, он страшную ересь выдавал...
Yaroslav
Philipp
Philipp
Gpt4o норм
Да из РФ, хрен оплатишь подписку...
Yaroslav
Philipp
Мне приходится и PyCharm на fallback лицензии держать...
Yaroslav
Yaroslav
Вообще можно оплачивать все эти вещи через различные сервисы. Но самы топ вариант. Взять отпуск, прилететь в Казахстан, сделать ИИН, сделать карту Каспи и все, оплачивайте сколько угодно.
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
ребят, посоветуйте туториалы пж. Можно и на английском
Александр
Привет народ. Поставил MongoDB на Devuan.
Cтавлю как написано тут. Дошел до момента с запуском, то что systemd нету с этим всё всё понятно. Просто пишу в консоль mongod и в ответ прилетает чтото похожее на json/
Александр
Подскажите как её правильно запускать?
Aleksey
День добрый
Сори за оффтоп, но подскажите пожалуйста тг каналы по брокерам (кролик, кафка) 😇
Aleksey
Mark
Looking for mongodb expert
Mark
Hello
robi
Как считаете есть смысл выкупить данные после взлома (READ_ME_TO_RECOVER_YOUR_DATA)? Или скорее снова обманут?
Артем
robi
robi
robi
Артем
400$
если данные важны, то можешь попробовать сторговаться до 200$ (мол половина, а после данных вторая), а потом кинуть)
robi
хм, попробую через гаранта договориться
vaillant.exe
vaillant.exe
Если не секрет, чтоб ошибок не повторить
robi
robi
открыл на беке remote connect, чтобы с локалки бд чекнуть через компас
robi
просыпаюсь, бд всю снесли
vaillant.exe
Печаль
robi
vaillant.exe
Я последнее время все через гаранта делать буду, студию разработки и дизайна, так-же рекламных моментов и тех.поддержки открываю. Образно говоря бизнеса под ключ человеку, от физического дизайна интерьера до цифрового. И вот тоже думаю что везде нужен гарант.
vaillant.exe
Иначе это фигня выйдет, если с моей страны - то контракт, если с другой - гарант.
robi
robi
vaillant.exe
Александр
Привет народ!
Подскажите нормальную либу для работы с монгой на питоне?
Andrey
Александр
Vasiliy
Александр
спасибо парни, на пока мне мотора и пимонги хватит
Александр
Народ подскажите, в запросе может быть 2 условия?
например мне надо выбрать группу доков командой find
чтобы
1<= x < 10
Александр
И еще подскажите в доках по пимонге написано что можно создать индекс, а в доках по мотору не нашёл. Можно ли для мотора создать индекс?
Kirilll
Александр
а про индекс что-нибудь подскажете?
Александр
Aleksandr
Привет всем, подскажите как выглядят коллекции чата один на один?
Aleksandr
Один пользователь общается только с другим, просто интересно как это, через вложенности или разные коллекции делается
Nick
если юзеры испльзуют внешние какито идентификаторы и нет необходимости самому их менеджерить то можно и без нее обойтись
Егор
Добрый день. Какие материалы по монге изучить можно?
Aleksandr
Vladimir