Пожалуйста, попробуйте следующие запросы:
Если вы не хотите, чтобы объект, у которого нет совпадений в коллекции Gateway
, существовал в массиве Alarms
в конечном результате:
db.Alarms.aggregate([{ $unwind: '$Alarms' }, {
$lookup: {
from: 'Gateway',
localField: 'Alarms.Gateway',
foreignField: '_id',
as: 'Alarms.Gateway'
}
}, { $match: { 'Alarms.Gateway': { $ne: [] } } },
{ $addFields: { 'Alarms.Gateway': { $arrayElemAt: ['$Alarms.Gateway', 0] } } },
{ $group: { _id: '$_id', Alarms: { $push: '$Alarms' } } }
])
Тест: MongoDB-Playground
В противном случае, если вы хотите, чтобы все объекты в массиве Alarms
возвращались независимо от того, есть ли совпадение в Gateway
или нет:
db.Alarms.aggregate([{ $unwind: '$Alarms' }, {
$lookup: {
from: 'Gateway',
localField: 'Alarms.Gateway',
foreignField: '_id',
as: 'Alarms.GatewayObj'
}
}, { $addFields: { 'Alarms.Gateway': { $cond: [{ $ne: ['$Alarms.GatewayObj', []] }, { $arrayElemAt: ['$Alarms.GatewayObj', 0] }, '$Alarms.Gateway'] } } },
{ $project: { 'Alarms.GatewayObj': 0 } },
{ $group: { _id: '$_id', Alarms: { $push: '$Alarms' } } }
])
Тест: MongoDB-Playground
Разница между двумя запросами будет одна, будет возвращаться ниже объекта в Alarms
массив (Vs) один не делает.
{
"Gateway": ObjectId("5e2b5425d02e05b6940de2fb"),
"Port": 2
}