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

MongoDB Nested Query ด้วย $and และ $or สำหรับเงื่อนไขซับซ้อน

การ Query แบบ Nested/Complex Condition ใน MongoDB สามารถทำได้โดยรวม $and และ $or เข้าด้วยกัน เนื้อหานี้สาธิตการค้นหาเอกสารที่ Name = "Bob" AND Age = 23 AND (CountryName = "UK" OR Message = "Hi")

ตัวอย่างข้อมูลทดสอบ

> db.demo12.insertOne({"Name":"Chris","Age":23,"CountryName":"US","Message":"Hello"});
{ "acknowledged": true, "insertedId": ObjectId("5e0f70a2d7df943a7cec4fa2") }

> db.demo12.insertOne({"Name":"David","Age":21,"CountryName":"US","Message":"Hello"});
{ "acknowledged": true, "insertedId": ObjectId("5e0f70acd7df943a7cec4fa3") }

> db.demo12.insertOne({"Name":"Bob","Age":23,"CountryName":"AUS","Message":"Hi"});
{ "acknowledged": true, "insertedId": ObjectId("5e0f70bad7df943a7cec4fa4") }

> db.demo12.insertOne({"Name":"Carol","Age":24,"CountryName":"US","Message":"Hi"});
{ "acknowledged": true, "insertedId": ObjectId("5e0f70c7d7df943a7cec4fa5") }

แสดงข้อมูลทั้งหมด

> db.demo12.find();
{
  "_id": ObjectId("5e0f70a2d7df943a7cec4fa2"),
  "Name": "Chris", "Age": 23, "CountryName": "US", "Message": "Hello"
}
{
  "_id": ObjectId("5e0f70acd7df943a7cec4fa3"),
  "Name": "David", "Age": 21, "CountryName": "US", "Message": "Hello"
}
{
  "_id": ObjectId("5e0f70bad7df943a7cec4fa4"),
  "Name": "Bob", "Age": 23, "CountryName": "AUS", "Message": "Hi"
}
{
  "_id": ObjectId("5e0f70c7d7df943a7cec4fa5"),
  "Name": "Carol", "Age": 24, "CountryName": "US", "Message": "Hi"
}

Query Nested Condition ($and + $or)

> db.demo12.find({
  $and: [
    { Name: 'Bob' },
    { Age: 23 },
    { $or: [ { CountryName: 'UK' }, { Message: 'Hi' } ] }
  ]
});

ผลลัพธ์ (Match แค่ Bob)

{
  "_id": ObjectId("5e0f70bad7df943a7cec4fa4"),
  "Name": "Bob", "Age": 23, "CountryName": "AUS", "Message": "Hi"
}

คำอธิบาย Logic

  • $and: ทุกเงื่อนไขต้อง True (Implicit AND ใน Top-level Query ก็ได้)
  • $or: อย่างน้อย 1 เงื่อนไข True
  • Logic: (Name=Bob) AND (Age=23) AND (Country=UK OR Message=Hi)
  • Bob: Name✓, Age✓, Country=AUS✗, Message=Hi✓ → OR True → Match
  • Carol: Name✗ (ไม่ใช่ Bob) → AND False → ไม่ Match
  • Chris: Name✗ → ไม่ Match
  • David: Name✗ → ไม่ Match

การเขียนแบบย่อ (Implicit AND)

// เทียบเท่ากัน (Top-level AND เป็น Implicit)
db.demo12.find({
  Name: 'Bob',
  Age: 23,
  $or: [ { CountryName: 'UK' }, { Message: 'Hi' } ]
});

Performance Tip

  • วาง Selective Condition ก่อน (Filter ให้เหลือน้อยที่สุด)
  • สร้าง Compound Index รองรับ Query Pattern
  • ใช้ explain() ตรวจสอบ Index Usage