Как обеспечить отображение $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"}}}