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

Query Element สุดท้ายของ Array ใน MongoDB ด้วย $arrayElemAt

การเข้าถึง element สุดท้าย (หรือ index ใดก็ได้) ของ array ใน MongoDB ใช้ $arrayElemAt ใน aggregate pipeline รองรับ index ลบ (-1 = ตัวสุดท้าย)

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

> db.demo103.insertOne({
  "Details" : [
    { "StudentId" : 101, "Details" : "MongoDB" },
    { "StudentId" : 102, "Details" : "MySQL" },
    { "StudentId" : 103, "Details" : "Java" }
  ],
  "Details1" : [ { "StudentId" : 104, "Number" : 3 } ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2ed2dd9fd5fd66da21446e") }

แสดงข้อมูล

> db.demo103.find();

ผลลัพธ์: Details มี 3 elements, Details1 มี 1 element

Query ดึง Element สุดท้ายของ Details แล้ว Filter

> db.demo103.aggregate([
  { $project: {
    Details1: 1,
    Details: { $arrayElemAt: ["$Details", -1] }
  }},
  { $match: { "Details.StudentId": 103 } }
])

คำอธิบาย:

  • $arrayElemAt: ["$Details", -1]: ดึง element index -1 (ตัวสุดท้าย) ของ array Details
  • ผลลัพธ์ของ $project: Details จะกลายเป็น object เดียว (ไม่ใช่ array)
  • $match: กรองต่อเฉพาะที่ Details.StudentId = 103

ผลลัพธ์

{ "_id" : ObjectId("5e2ed2dd9fd5fd66da21446e"), "Details1" : [
  { "StudentId" : 104, "Number" : 3 }
], "Details" : { "StudentId" : 103, "Details" : "Java" } }

$arrayElemAt Syntax

{ $arrayElemAt: [ ,  ] }

การใช้งานอื่นๆ

ดึง Element แรกและสุดท้ายพร้อมกัน

db.demo103.aggregate([
  { $project: {
    first: { $arrayElemAt: ["$Details", 0] },
    last: { $arrayElemAt: ["$Details", -1] }
  }}
])

ดึง Element ตามเงื่อนไข (ไม่ใช่ index คงที่)

ใช้ $filter แทน:

db.demo103.aggregate([
  { $project: {
    matched: {
      $filter: {
        input: "$Details",
        cond: { $eq: ["$$this.StudentId", 102] }
      }
    }
  }}
])

ใช้ใน $match โดยตรง (MongoDB 4.4+)

db.demo103.find({
  $expr: { $eq: [ { $arrayElemAt: ["$Details", -1] }, { StudentId: 103, Details: "Java" } ] }
})

สรุป: $arrayElemAt เหมาะสำหรับเข้าถึง element ด้วย index คงที่ (first, last, nth) ส่วนเงื่อนไขแบบ dynamic ให้ใช้ $filter

Indexความหมาย
0Element แรก
1Element ที่ 2
-1Element สุดท้าย
-2Element ต่อจากสุดท้าย