Sie können entweder $slice
verwenden
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Oder geben Sie mit MongoDB 3.6 einfach den letzten Beitrag mit $lookup
zurück in seiner nicht korrelierten Form:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Letzteres ist besser, weil Sie nur das Dokument aus der ausländischen Sammlung zurücksenden, das Sie tatsächlich wollen.
Wenn Sie sicher sind, dass Sie "Singular" wollen, dann $arrayElemAt
ist austauschbar mit $slice
im ersten Beispiel, gibt aber nur das letzte Element anstelle des Arrays des letzten Elements zurück. Sie können es auch zum zweiten Formular hinzufügen, um nur ein Element aus der Pipeline zu nehmen, das "immer" ein Array ist:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}},
{ "$addFields": {
"post": { "$arrayElemAt": [ "$post", 0 ] }
}}
])
Und so herum ist es die 0
index statt -1
zum Schluss.