Framework Aggregation ของ MongoDB มี Operator $slice ที่ช่วยดึง subset ของอาร์เรย์ได้ ทั้งแบบระบุตำแหน่งเริ่มต้นและจำนวน หรือตำแหน่งลบ (นับจากท้าย) บทความนี้สาธิตการดึง element เดี่ยวที่ตำแหน่งแน่นอน
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.exactPositionDemo.insertOne({"StudentName":"John","StudentScores":[78,98,56,45,89]});
{ "acknowledged": true, "insertedId": ObjectId("5cd29a1c345990cee87fd883") }
แสดงข้อมูล
> db.exactPositionDemo.find().pretty();
ผลลัพธ์:
{
"_id": ObjectId("5cd29a1c345990cee87fd883"),
"StudentName": "John",
"StudentScores": [78, 98, 56, 45, 89]
}
กรณีที่ 1: ดึง Element ตำแหน่งที่ 0 (Element แรก) จำนวน 1 รายการ
Syntax: {$slice: ["$field", skip, limit]}
> db.exactPositionDemo.aggregate([
{ "$project": { "StudentScores": { "$slice": ["$StudentScores", 0, 1] } }}
]);
ผลลัพธ์: ได้ค่า 78 (element แรก)
{
"_id": ObjectId("5cd29a1c345990cee87fd883"),
"StudentScores": [78]
}
กรณีที่ 2: ดึง Element ตำแหน่งที่ 1 (Element ที่สอง) จำนวน 1 รายการ
> db.exactPositionDemo.aggregate([
{ "$project": { "StudentScores": { "$slice": ["$StudentScores", 1, 1] } }}
]);
ผลลัพธ์: ได้ค่า 98 (element ที่สอง)
{
"_id": ObjectId("5cd29a1c345990cee87fd883"),
"StudentScores": [98]
}
รูปแบบ $slice แบบต่างๆ
| Syntax | ความหมาย | ตัวอย่างผลลัพธ์จาก [78,98,56,45,89] |
|---|---|---|
[$arr, 0, 1] | ข้าม 0 ตัว, เอา 1 ตัว (ตัวแรก) | [78] |
[$arr, 1, 1] | ข้าม 1 ตัว, เอา 1 ตัว (ตัวที่ 2) | [98] |
[$arr, 2, 2] | ข้าม 2 ตัว, เอา 2 ตัว | [56, 45] |
[$arr, -2, 2] | นับจากท้าย 2 ตัว, เอา 2 ตัว | [45, 89] |
[$arr, 3] | ข้าม 3 ตัว, เอาทั้งหมดที่เหลือ | [45, 89] |
หมายเหตุ
$sliceใน Aggregation ($project) คืนค่าเป็นอาร์เรย์เสมอ แม้ระบุ limit=1- หากต้องการค่าเดี่ยว (scalar) ต้องใช้
$arrayElemAtแทน:{$arrayElemAt: ["$StudentScores", 1]}→ คืนค่า98โดยตรง - รองรับ Nested Array ได้ หากใช้ Dot Notation ใน path