Để cắt (slice) mảng bên trong mảng object, dùng $map kết hợp $slice trong $addFields.
Dữ liệu mẫu: Mảng Details chứa object có mảng Subjects
> db.demo111.insertOne({
"_id" : 101, "Name" : "Chris",
"Details" : [
{ "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" }, { "_id" : "10003", "SubjectName" : "MongoDB" } ] },
{ "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] }
]
});
{ "acknowledged" : true, "insertedId" : 101 }
Pipeline aggregate
> db.demo111.aggregate([
{ "$addFields": {
"Details": {
"$map": {
"input": "$Details",
"as": "out",
"in": {
"_id": "$$out._id",
"Score": "$$out.Score",
"Subjects": { "$slice": [ "$$out.Subjects", 1 ] }
}
}
}
}}
]);
Kết quả
{ "_id" : 101, "Name" : "Chris", "Details" : [ { "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" } ] }, { "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] } ] }
Giải thích:
$map: Biến đổi từng phần tử của mảng Details$$out: Phần tử hiện tại (object có _id, Score, Subjects)$slice: ["$$out.Subjects", 1]: Lấy 1 phần tử đầu tiên của mảng Subjects- Dùng số dương: lấy từ đầu. Số âm: lấy từ cuối (ví dụ -1 = phần tử cuối)
Mở rộng: $slice cũng dùng trong projection find: {Subjects: {$slice: 2}} (lấy 2 phần tử đầu) hoặc {Subjects: {$slice: -2}} (lấy 2 phần tử cuối).