Bạn có thể sử dụng $slice
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"localField": "_id",
"foreignField": "group",
"as": "post"
}},
{ "$addFields": {
"post": { "$slice": ["$post", -1] }
}}
])
Hoặc với MongoDB 3.6, chỉ cần trả lại bài đăng cuối cùng bằng cách sử dụng $lookup
ở dạng không tương quan:
db.groups.aggregate([
{ "$lookup": {
"from": "posts",
"as": "post",
"let": { "id": "$_id" },
"pipeline": [
{ "$match": {
"$expr": { "$eq": [ "$$id", "$group" ] }
}},
{ "$sort": { "_id": -1 } },
{ "$limit": 1 }
]
}}
])
Cái sau tốt hơn vì bạn chỉ trả lại tài liệu từ bộ sưu tập nước ngoài mà bạn thực sự muốn.
Nếu bạn chắc chắn rằng bạn muốn "số ít" thì hãy $arrayElemAt
có thể hoán đổi cho nhau bằng $slice
trong ví dụ ban đầu nhưng trả về phần tử cuối cùng thay vì chỉ mảng của phần tử cuối cùng. Bạn cũng có thể thêm nó vào biểu mẫu thứ hai để chỉ lấy một phần tử từ đường ống, là "luôn luôn" là một mảng:
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 ] }
}}
])
Và xung quanh đó là 0
chỉ mục thay vì -1
cuối cùng.