Невозможно объединить несколько коллекций

avatar
Vasu Youth
1 июля 2021 в 16:39
40
1
0

У меня есть коллекция user, в которой есть объект роли с идентификатором роли. У меня также есть коллекция roles с идентификатором

.

Теперь для каждой роли я хочу получить список пользователей.

Пример:

[
    {
        "name": "Scott",
        "role": {
            "roleId": "123432"
        }
    },
    {
        "name": "John",
        "role": {
            "roleId": "123432"
        }
    },
    {
        "name": "Scott",
        "role": {
            "roleId": "556432"
        }
    }
]

Данные ролей:

[
    {
        "id": "123432"
        "name": "admin",
        "type": "internal"
    },
    {
        "id": "556432"
        "name": "owner",
        "type": "external"
    },
    {
        "id": "556432"
        "name": "owner",
        "type": "internal"
    } 
]

Теперь я хочу получить все роли типа internal и связанных с ними пользователей:

Итак, вывод должен быть

[
    {
       "role": "123432",
        "users": [
            {
                "name": "Scott",
                "role": {
                    "roleId": "123432"
                }
            },
            {
                "name": "John",
                "role": {
                    "roleId": "123432"
                }
            }
        ],
        { 
            "role": "556432",
            "users": []
         }
    }
]

Я делаю это с помощью Spring Boot. Если кто-нибудь может помочь мне в том, как получить эту агрегацию с помощью Spring Boot mongo, это было бы очень полезно для меня. Большое спасибо.

Источник

Ответы (1)

avatar
Hussam
1 июля 2021 в 17:01
1

Выполните агрегирование для вашей коллекции ролей и сначала отфильтруйте роль в соответствии с вашим условием. Поскольку вам нужны все роли internal, ваша стадия матча должна быть:

{
    $match: {
      "type": "internal"
    }
}

Пришло время найти пользователей для каждой роли:

{
    $lookup: {
      from: "user",
      as: "users",
      localField: "id",
      foreignField: "role.roleId"
    }
}

Я не знаю, как запросы монго выполняются при весенней загрузке, но так это делается в монго, поэтому вы можете преобразовать его в код, специфичный для вашего языка.

Вот рабочий пример на игровой площадке mongo.

https://mongoplayground.net/p/I1FPuX971YZ