Как обеспечить отображение $lookup на правильно соответствующий объект в представлении MongoDB

В моем бэкэнде MongoDB/Node я создаю представление с использованием Studio 3T для возврата некоторого подмножества данных из коллекции. Я также делаю $lookup вводить некоторые данные из второй коллекции и вставлять туда, где mongoID обычно появляется как ссылка на другую коллекцию.

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

Это то, что мой начальный $project Похоже, и это первый этап моего конвейера:

{ "name" : 1.0, "dob" : 1.0, "coverage" : 1.0, "payer" : 1.0 }

На втором этапе я делаю $lookup, который выглядит так:

{ "from" : "payers", "localField" : "coverage.payer", "foreignField" : "_id", "as" : "payerInfo" }

Наконец я формирую, как данные выглядят с шагом как это:

"coverage" : { "payer" : { "id" : "$payerInfo._id", "name" : "$payerInfo.name" }

Проблема, с которой я сталкиваюсь, заключается в том, что, если, например, "покрытие" - которое из первичной коллекции - имеет более одного объекта в массиве, то та же информация о "плательщике" - из вторичной коллекции - заходит за каждого из них. Так что в основном индексация отключена. Для каждого объекта в массиве покрытия должны быть разные payerId и payerName.

Какую операцию можно выполнить, чтобы гарантировать, что правильно соответствующая информация о плательщике (извлеченная из второй коллекции через поиск $) будет помещена в соответствующий объект в массиве "охват"?

Ниже показано, как выглядят выходные данные (и, как я уже сказал, это неверно. Сейчас одна и та же информация о плательщике добавляется к обоим объектам в массиве "покрытие", когда они должны отличаться).

    "coverage": [
        {
            "payer": {
                "id": [
                    "12345"
                ],
                "name": [
                    {
                        "long": "National United",
                        "short": "NU"
                    }
                ]
            },
            "field2": value,
            "field3": value,
            "field4": value,
        },
        {
            "payer": {
                "id": [
                    "12345"
                ],
                "name": [
                    {
                        "long": "National United",
                        "short": "NU"
                    }
                ]
            },
            "field2": value,
            "field3": value,
            "field4": value,

        }
    ]

Какую дополнительную операцию я могу добавить к конвейеру представления, чтобы решить эту проблему?

1 ответ

Решение

Использование $unwind перед $lookup и добавить $unwind а также $addFields с, чтобы включить поля по вашему выбору из объединенной коллекции документов и другой $addFields переместить соответствующую информацию плательщика в покрытие и $group этап после $project вытащить все покрытия в массив в версии 3.4.

Что-то вроде

Этап 2

{"$unwind":"$coverage"}

Этап 3

{ "from" : "payers", "localField" : "coverage.payer", "foreignField" : "_id", "as" : "payerInfo" }

4 этап

 {"$unwind":"$payerInfo"}

5 этап

{"$addFields":{ "payerInfo" : { "id" : "$payerInfo._id", "name" : "$payerInfo.name" }

Этап 6

{"$addFields":{"coverage.payer":"$payerInfo"}}

Этап 7

{"$project":{"payerInfo":0}}

Этап 8

{"$group":{"_id":"$_id", "coverage":{"$push":"$coverage"}}}
Другие вопросы по тегам