Donc, comme vous le savez tous, find()
renvoie un tableau de résultats, findOne()
ne renvoyant qu'un simple objet.
Avec Angular, cela fait une énorme différence. Au lieu d'aller {{myresult[0].name}}
, Je peux simplement écrire {{myresult.name}}
.
J'ai constaté que le $lookup
dans le pipeline d'agrégats renvoie un tableau de résultats au lieu d'un seul objet.
Par exemple, j'ai deux collets:
users
collection:
[{
"firstName": "John",
"lastName": "Smith",
"country": 123
}, {
"firstName": "Luke",
"lastName": "Jones",
"country": 321
}]
countries
collection:
[{
"name": "Australia",
"code": "AU",
"_id": 123
}, {
"name": "New Zealand",
"code": "NZ",
"_id": 321
}]
Mon agrégat $lookup
:
db.users.aggregate([{
$project: {
"fullName": {
$concat: ["$firstName", " ", "$lastName"]
},
"country": "$country"
}
}, {
$lookup: {
from: "countries",
localField: "country",
foreignField: "_id",
as: "country"
}
}])
Les résultats de la requête:
[{
"fullName": "John Smith",
"country": [{
"name": "Australia",
"code": "AU",
"_id": 123
}]
}, {
"fullName": "Luke Jones",
"country": [{
"name": "New Zealand",
"code": "NZ",
"_id": 321
}]
}]
Comme vous pouvez le voir par les résultats ci-dessus, chaque country
est un tableau au lieu d'un seul objet comme "country": {....}
.
Comment puis-je avoir mon $lookup
retourner un seul objet au lieu d'un tableau car il ne correspondra qu'à un seul document?
Vous y êtes presque, vous devez en ajouter un autre $project
étape vers votre pipeline et utilisez le $arrayElemAt
pour renvoyer l'élément unique dans le tableau.
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 ] }
}}
]
)
Vous pouvez aussi utiliser "preserveNullAndEmptyArrays"
Ainsi:
db.users.aggregate(
[
{ "$project": {
"fullName": {
"$concat": [ "$firstName", " ", "$lastName"]
},
"country": "$country"
}},
{ "$lookup": {
"from": "countries",
"localField": "country",
"foreignField": "_id",
"as": "countryInfo"
}},
{"$unwind": {
"path": "$countryInfo",
"preserveNullAndEmptyArrays": true
}
},
]
)