Để truy xuất phần tử cuối cùng của mảng, dùng $arrayElemAt với index âm (-1) trong aggregate.
Dữ liệu mẫu
> db.demo103.insertOne({
"Details" : [
{ "StudentId" : 101, "Details" : "MongoDB" },
{ "StudentId" : 102, "Details" : "MySQL" },
{ "StudentId" : 103, "Details" : "Java" }
],
"Details1" : [ { "StudentId" : 104, "Number" : 3 } ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2ed2dd9fd5fd66da21446e") }
Pipeline aggregate
> db.demo103.aggregate([
{ $project: {
Details1: 1,
Details: { $arrayElemAt: [ "$Details", -1 ] }
}},
{ $match: { "Details.StudentId": 103 } }
])
Kết quả
{ "_id" : ObjectId("5e2ed2dd9fd5fd66da21446e"), "Details1" : [ { "StudentId" : 104, "Number" : 3 } ], "Details" : { "StudentId" : 103, "Details" : "Java" } }
Giải thích:
$arrayElemAt: ["$Details", -1]: Lấy phần tử index -1 (phần tử cuối). Index dương: 0=đầu, 1=thứ 2...- Kết quả
Detailstrở thành object đơn (không còn mảng) - Stage
$matchsau đó lọc trên object đó
Mở rộng:
- Lấy N phần tử cuối:
$slice: ["$Details", -N](trả về mảng) - Lấy phần tử đầu:
$arrayElemAt: ["$Details", 0]hoặc$firsttrong $group - Kết hợp
$filterđể lọc trước rồi lấy cuối