Vous pouvez soit utiliser $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Ou avec MongoDB 3.6, renvoyez simplement le dernier message en utilisant $lookup
sous sa forme non corrélée :
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Ce dernier est préférable car vous ne restituez que le document de la collection étrangère que vous souhaitez réellement.
Si vous êtes certain de vouloir "singulier", alors $arrayElemAt
est interchangeable avec $slice
dans l'exemple initial mais renvoie le dernier élément au lieu du tableau du dernier élément uniquement. Vous pouvez également l'ajouter au deuxième formulaire pour ne prendre qu'un élément du pipeline, qui est "toujours" un tableau :
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 ] }
}}
])
Et de cette façon c'est le 0
index plutôt que -1
pour la fin.