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

MongoDB: ดึงค่าสุดท้าย 2 ค่าของ Array ด้วย $slice

การดึง element สุดท้ายของ array ใน MongoDB ใช้ projection ด้วย $slice ค่าลบ (-n = n ตัวสุดท้าย) ใช้ได้ทั้ง find() และ aggregate()

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo173.insertOne({"ListOfValues":[10,40,100,560,700,900]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e383a4f9e4f06af551997e4") }

แสดงข้อมูล

> db.demo173.find().pretty();

ผลลัพธ์: ListOfValues มี 6 elements [10, 40, 100, 560, 700, 900]

Query ดึง 2 ค่าสุดท้ายด้วย $slice ใน Find Projection

> db.demo173.find({}, { "ListOfValues": { "$slice": -2 } });

คำอธิบาย:

  • Filter: {} (ทุกเอกสาร)
  • Projection: {"ListOfValues": {"$slice": -2}} - ดึง 2 ตัวสุดท้าย
  • -2: negative = นับจากท้าย (-1 = ตัวสุดท้าย, -2 = 2 ตัวสุดท้าย)

ผลลัพธ์

{ "_id" : ObjectId("5e383a4f9e4f06af551997e4"), "ListOfValues" : [ 700, 900 ] }

$slice ใน Find Projection - รูปแบบทั้งหมด

ใช้ $slice ใน Aggregate ($project)

db.demo173.aggregate([
  { $project: {
    ListOfValues: { $slice: ["$ListOfValues", -2] }
  }}
])

Pagination กับ Array (Skip + Limit)

ดึงหน้าที่ 2 ของ array (3 ตัวต่อหน้า):

// หน้า 1: skip 0, limit 3
{ $slice: ["$ListOfValues", 0, 3] }  // [10, 40, 100]

// หน้า 2: skip 3, limit 3
{ $slice: ["$ListOfValues", 3, 3] }  // [560, 700, 900]

กรณี Array เล็กกว่าที่ขอ

หาก array มี 2 elements ขอ $slice: 5 → คืนทั้ง 2 elements (ไม่ error)

Performance Note

  • $slice ใน find projection: efficient, ใช้ได้กับ index (covered query)
  • $slice ใน aggregate: ต้อง process 全文档
  • Array ใหญ่มาก (>10k elements) ควรพิจารณา schema redesign

สรุป: $slice ด้วยค่าลบ (-n) = วิธีง่ายที่สุดดึง n ตัวสุดท้ายของ array ใน find() projection

Syntaxคำอธิบายตัวอย่าง [10,40,100,560,700,900]
{$slice: 3}3 ตัวแรก[10, 40, 100]
{$slice: -3}3 ตัวสุดท้าย[560, 700, 900]
{$slice: [2, 3]}ข้าม 2 ตัว แล้วเอา 3 ตัว[100, 560, 700]
{$slice: [-3, 2]}นับจากท้าย -3 (index 3) เอา 2 ตัว[560, 700]