การ slice (ตัด) array ที่อยู่ภายใน array (nested array) ใน MongoDB ใช้ $slice ร่วมกับ $map ใน $addFields เพื่อ transform ทุก element ของ outer array
สร้างคอลเลกชันและข้อมูลตัวอย่าง (3 ระดับ)
> 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 }
แสดงข้อมูล
> db.demo111.find();
ผลลัพธ์: Details array 2 elements, แต่ละ element มี Subjects array
Query Slice Subjects Array ให้เหลือ 1 Element แรก
> db.demo111.aggregate([
{ "$addFields": {
"Details": {
"$map": {
"input": "$Details",
"as": "out",
"in": {
"_id": "$$out._id",
"Score": "$$out.Score",
"Subjects": { "$slice": ["$$out.Subjects", 1] }
}
}
}
}}
])
คำอธิบาย:
$addFields: แทนที่ Details array ด้วยผลลัพธ์ใหม่ คง field อื่นๆ$map: วนลูปแต่ละ element ใน Details (ตัวแปร $$out)$slice: ["$$out.Subjects", 1]: ตัด array Subjects ให้เหลือ 1 element แรก (index 0)- สร้าง object ใหม่รวม _id, Score, และ Subjects ที่ slice แล้ว
ผลลัพธ์
{ "_id" : 101, "Name" : "Chris", "Details" : [
{ "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" } ] },
{ "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] }
] }
Subjects ของแต่ละ element เหลือแค่ตัวแรก (MySQL, Java)
$slice Syntax
{ $slice: [ , ] } // n elements แรก
{ $slice: [ , , ] } // ข้าม skip ตัว แล้วเอา n ตัว
| n | ผลลัพธ์ |
|---|---|
| 1 | Element แรก 1 ตัว |
| 3 | Element แรก 3 ตัว |
| -1 | Element สุดท้าย 1 ตัว |
| -2 | Element สุดท้าย 2 ตัว |