Anda dapat menggunakan $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Atau dengan MongoDB 3.6, cukup kembalikan posting terakhir menggunakan $lookup
dalam bentuk yang tidak berkorelasi:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Yang terakhir lebih baik karena Anda hanya mengembalikan dokumen dari koleksi asing yang benar-benar Anda inginkan.
Jika Anda yakin ingin "tunggal" maka $arrayElemAt
dapat dipertukarkan dengan $slice
dalam contoh awal tetapi mengembalikan elemen terakhir alih-alih array elemen terakhir saja. Anda juga dapat menambahkannya ke formulir kedua untuk mengambil satu elemen saja dari pipeline, yang "selalu" berupa array:
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 ] }
}}
])
Dan sebaliknya adalah 0
indeks daripada -1
untuk yang terakhir.