Войти Регистрация
Data base

250. Общие папки пользователя без висячих ссылок

Средняя

В Яндекс Диске данные об общих папках долго жили в отдельной 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 — одна строка — доступ одного пользователя к одной папке

ПолеТипЧто значит
uidstringпользователь
share_idstringссылка на shares._id
rightsstringowner / rw / ro

shares — одна общая папка

ПолеТипЧто значит
_idstringидентификатор папки
owner_uidstringвладелец
pathstringпуть у владельца

Пример: документы

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"
 }
]
Как проверяем Запрос — JSON: имя коллекции и стадии aggregate, как в db.коллекция.aggregate([...]). Выполняем его в браузере движком агрегаций на 4 наборах документов: пример выше и скрытые — с пропущенными полями, null и пустыми коллекциями. Порядок документов важен, порядок полей внутри документа — нет. $out и $merge запрещены.
{"collection": "share_links", "pipeline": [ … ]}
$lookup$unwindсвязи без внешних ключейсортировка

Источник: кейс Яндекса: перенос общих папок Яндекс Диска из MongoDB CommonDB в PostgreSQL, 2025. Условие пересказано своими словами.