Как использовать MongoDBs aggregate `$ lookup` как` findOne() `
Итак, как вы все знаете, find()
возвращает массив результатов, а findOne()
возвращает просто простой объект.
С Angular это имеет огромное значение. Вместо перехода {{myresult[0].name}}
я могу просто написать {{myresult.name}}
.
Я обнаружил, что метод $lookup
в конвейере агрегата возвращает массив результатов, а не только один объект.
Например, у меня есть два столбца:
users
Коллекция:
[{
"firstName": "John",
"lastName": "Smith",
"country": 123
}, {
"firstName": "Luke",
"lastName": "Jones",
"country": 321
}]
countries
Коллекция:
[{
"name": "Australia",
"code": "AU",
"_id": 123
}, {
"name": "New Zealand",
"code": "NZ",
"_id": 321
}]
Мой агрегат $lookup
:
db.users.aggregate([{
$project: {
"fullName": {
$concat: ["$firstName", " ", "$lastName"]
},
"country": "$country"
}
}, {
$lookup: {
from: "countries",
localField: "country",
foreignField: "_id",
as: "country"
}
}])
Результаты запроса:
[{
"fullName": "John Smith",
"country": [{
"name": "Australia",
"code": "AU",
"_id": 123
}]
}, {
"fullName": "Luke Jones",
"country": [{
"name": "New Zealand",
"code": "NZ",
"_id": 321
}]
}]
Как видно из приведенных выше результатов, каждый country
представляет собой массив вместо одного объекта, такого как "country": {....}
.
Как я могу вернуть $lookup
один объект вместо массива, поскольку он будет только соответствовать одному документу?
Ответы
Ответ 1
Вы почти там, вам нужно добавить еще один $project
в свой конвейер и использовать $arrayElemAt
, чтобы вернуть один элемент в массив.
db.users.aggregate(
[
{ "$project": {
"fullName": {
"$concat": [ "$firstName", " ", "$lastName"]
},
"country": "$country"
}},
{ "$lookup": {
"from": "countries",
"localField": "country",
"foreignField": "_id",
"as": "countryInfo"
}},
{ "$project": {
"fullName": 1,
"country": 1,
"countryInfo": { "$arrayElemAt": [ "$countryInfo", 0 ] }
}}
]
)