Wie zu verwenden MongoDBs Aggregat "$lookup " als " findOne()`
So, wie Sie alle wissen find()
gibt ein array der Ergebnisse, mit findOne()
Rückkehr nur einfach Objekt.
Winklig, das macht einen großen Unterschied. Anstatt {{myresult[0].name}}
ich kann einfach nur schreiben {{myresult.name}}
.
Habe ich festgestellt, dass die $lookup
- Methode die Aggregat-pipeline liefert ein array der Ergebnisse statt nur ein einzelnes Objekt.
Ich habe zum Beispiel zwei colletions:
users
Sammlung:
[{
"firstName": "John",
"lastName": "Smith",
"country": 123
}, {
"firstName": "Luke",
"lastName": "Jones",
"country": 321
}]
countries
Sammlung:
[{
"name": "Australia",
"code": "AU",
"_id": 123
}, {
"name": "New Zealand",
"code": "NZ",
"_id": 321
}]
Mein Aggregat $lookup
:
db.users.aggregate([{
$project: {
"fullName": {
$concat: ["$firstName", " ", "$lastName"]
},
"country": "$country"
}
}, {
$lookup: {
from: "countries",
localField: "country",
foreignField: "_id",
as: "country"
}
}])
Die Ergebnisse aus der Abfrage:
[{
"fullName": "John Smith",
"country": [{
"name": "Australia",
"code": "AU",
"_id": 123
}]
}, {
"fullName": "Luke Jones",
"country": [{
"name": "New Zealand",
"code": "NZ",
"_id": 321
}]
}]
Wie Sie sehen können von der oben angeführten Ergebnisse, die jeweils country
ist ein array, anstatt ein einzelnes Objekt wie "country": {....}
.
Wie kann ich meine $lookup
Gegenzug ein einzelnes Objekt statt eines Arrays, da es immer nur mit einem einzelnen Dokument?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist fast da, müssen Sie ein anderes
$project
Bühne, um Ihre pipeline und die Nutzung der$arrayElemAt
zurück das einzelne element im array.$unwind
docs.mongodb.com/manual/reference/operator/aggregation/unwindKönnen Sie auch
"preserveNullAndEmptyArrays"
Etwa so: