Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ใช้ $slice ใน Aggregation ดึง Element ตำแหน่งที่กำหนดจาก Nested Array ใน MongoDB

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