การ 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