Я пытаюсь выполнить агрегацию, но не могу найти правильный конвейер для этого.
Итак, это часть моей модели документа:
//company.js
{
"_id" : "5dg8aa8c435b1e2868c841f6",
"name" : "My Corp",
"externalId" : "d7f348c9-c69b-69c4-923c-91458c53dc22",
"professionals_customers" : [
{
"company" : "6f4d01eb3b948150c2aad9c0"
},
{
"company" : "5dg7aa8c366b1e2868c841f6",
"contact" : "5df8ab5c355b1e2999c841f7"
}
],
}
Я пытаюсь чтобы вернуть поля профессиональных клиентов, заполненные данными, как это сделал бы класс c.
Поле компании получено из коллекции компании, а контакт предоставлен коллекцией пользователей
Требуемый результат должен выглядеть так:
{
"professionals_customers" : [
{
"company": {
"_id": "6f4d01eb3b948150c2aad9c0",
"name": "Transtar",
"externalId": "d7f386c9-c79b-49c5-905c-90750c42dc22",
},
},
{
"company": {
"_id": "5dg7aa8c366b1e2868c841f6",
"name": "Aperture",
"externalId": "d7f386c9-c69b-49c4-905c-90750c53dc22",
},
"contact" : {
"_id": "5df8ab5c355b1e2999c841f7",
"firstname": "Caroline",
"lastname": "Glados",
"externalId": "d7f386c9-c69b-49c4-905c-90750c53dc22", //same externalId as above, the user belongs to the company
},
}
]
}
На данный момент я пробовал несколько решений, но не могу достичь своей цели.
let query = [{
$match : { _id : companyId }
},{
$lookup : {
from: 'companies',
localField : 'professionals_customers.company',
foreignField : '_id',
as : 'professionalsCustomers'
}
},{
$lookup : {
from: 'users',
localField : 'professionals_customers.contact',
foreignField : '_id',
as : 'contacts'
}
}]
На данный момент у меня есть два новых массивы со всей необходимой информацией, но я не знаю, как получить правильный контакт, сгруппированный с нужной компанией. Также, возможно, проще попытаться заполнить данные (с помощью $ lookup), сохраняя первоначальную структуру, чем пытаться перегруппировать professionalCustomers и контакты через общий externalId.
Дополнительная информация:
-An user принадлежащий компании имеет тот же внешний идентификатор.
-Я не хочу использовать классическое заполнение, после этого мне нужно сделать некоторые другие операции