В Яндекс Диске данные об общих папках долго жили в отдельной MongoDB — CommonDB. В shares — сами общие папки, в share_links — кто к какой папке имеет доступ. Коллекции связаны идентификатором, но без внешних ключей: папку могут удалить, а ссылка на неё останется. CommonDB читали на каждый запрос, и в итоге число соединений подошло к пределу — данные переехали в шардированный PostgreSQL.
Здесь у владельца тоже есть строка в share_links с rights: "owner", у гостей — rw или ro. Пользователь u1 открывает раздел «Общие папки».
Верните path и rights для всех папок, к которым у u1 есть доступ, по возрастанию path. Ссылки на папки, которых уже нет в shares, не показывайте.
В работе: Списки «доступно мне» в файловых хранилищах, документах, проектах — везде, где права и объекты лежат отдельно.
MongoDB · MongoDB 8.0.20
Коллекции
share_links — одна строка — доступ одного пользователя к одной папке
| Поле | Тип | Что значит |
|---|---|---|
uid | string | пользователь |
share_id | string | ссылка на shares._id |
rights | string | owner / rw / ro |
shares — одна общая папка
| Поле | Тип | Что значит |
|---|---|---|
_id | string | идентификатор папки |
owner_uid | string | владелец |
path | string | путь у владельца |
Пример: документы
shares
[
{
"_id": "sh-1",
"owner_uid": "u1",
"path": "/Отпуск 2026"
},
{
"_id": "sh-2",
"owner_uid": "u7",
"path": "/Договоры"
},
{
"_id": "sh-3",
"owner_uid": "u8",
"path": "/Курсовая"
}
]share_links
[
{
"uid": "u1",
"share_id": "sh-1",
"rights": "owner"
},
{
"uid": "u7",
"share_id": "sh-1",
"rights": "rw"
},
{
"uid": "u7",
"share_id": "sh-2",
"rights": "owner"
},
{
"uid": "u1",
"share_id": "sh-2",
"rights": "ro"
},
{
"uid": "u8",
"share_id": "sh-3",
"rights": "owner"
}
]
Ожидаемый ответ
[
{
"rights": "ro",
"path": "/Договоры"
},
{
"rights": "owner",
"path": "/Отпуск 2026"
}
]
db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 4 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "share_links", "pipeline": [ … ]}
Источник: кейс Яндекса: перенос общих папок Яндекс Диска из MongoDB CommonDB в PostgreSQL, 2025. Условие пересказано своими словами.
Посмотреть данные, проверить часть pipeline. На зачёт не влияет.
Здесь появится результат отправки.