ใช้ $expr ร่วมกับ $let, $indexOfArray, $arrayElemAt เพื่อดึงออบเจ็กต์เฉพาะในอาร์เรย์มาเปรียบเทียบค่า
ตัวอย่างข้อมูลทดสอบ
> db.demo366.insertOne({
"Name" : "Chris",
"details" : [
{"Id" : "John1", "value" : "test"},
{"Id" : "John2", "value" : 18},
{"Id" : "John3", "value" : 20}
]
});
แสดงข้อมูล
> db.demo366.find();
{
"_id" : ObjectId("5e57ddd92ae06a1609a00ae7"),
"Name" : "Chris",
"details" : [
{"Id" : "John1", "value" : "test"},
{"Id" : "John2", "value" : 18},
{"Id" : "John3", "value" : 20}
]
}
คิวรี่เปรียบเทียบ value ของ John2 และ John3 (John2 < John3)
> db.demo366.find({
"$expr":{
"$let":{
"vars":{
"john2":{"$arrayElemAt":["$details",{"$indexOfArray":["$details.Id","John2"]}]},
"john3":{"$arrayElemAt":["$details",{"$indexOfArray":["$details.Id","John3"]}]}
},
"in":{"$lt":["$$john2.value","$$john3.value"]}
}
}
})
ผลลัพธ์
{
"_id" : ObjectId("5e57ddd92ae06a1609a00ae7"),
"Name" : "Chris",
"details" : [
{"Id" : "John1", "value" : "test"},
{"Id" : "John2", "value" : 18},
{"Id" : "John3", "value" : 20}
]
}
คำอธิบาย:
$indexOfArrayหาตำแหน่งของออบเจ็กต์ที่ Id = "John2" และ "John3"$arrayElemAtดึงออบเจ็กต์ทั้งตัว ณ ตำแหน่งนั้น$letกำหนดตัวแปรชั่วคราว john2, john3$ltเปรียบเทียบ $$john2.value < $$john3.value (18 < 20 = true)