ใช้ $addFields ร่วม $objectToArray แปลงเอกสารทั้งฉบับเป็นอาร์เรย์ key-value แล้วกรองด้วย $match
ตัวอย่างข้อมูลทดสอบ
> db.demo375.insertOne({"details":{"Name":"John","Age":23}});
> db.demo375.insertOne({"details":{"Name":"David","Age":21}});
> db.demo375.insertOne({"details":{"Name":"David","Age":22}});
แสดงข้อมูลทั้งหมด
> db.demo375.find();
{
"_id" : ObjectId("5e5a0ae42ae06a1609a00b06"),
"details" : { "Name" : "John", "Age" : 23 }
}
{
"_id" : ObjectId("5e5a0ae42ae06a1609a00b07"),
"details" : { "Name" : "David", "Age" : 21 }
}
{
"_id" : ObjectId("5e5a0ae42ae06a1609a00b08"),
"details" : { "Name" : "David", "Age" : 22 }
}
คำสั่ง Aggregation ค้นหา Name = "David" โดยไม่ระบุพาธ
> db.demo375.aggregate([
{ "$addFields": { "UnknownKeys": { "$objectToArray": "$$ROOT" } }},
{ "$match": { "UnknownKeys.v.Name": "David" }},
{ "$project": { "UnknownKeys": 0 }}
])
ผลลัพธ์ (ได้เอกสารที่ Name = David ทั้ง 2 รายการ)
{
"_id" : ObjectId("5e5a0ae42ae06a1609a00b07"),
"details" : { "Name" : "David", "Age" : 21 }
}
{
"_id" : ObjectId("5e5a0ae42ae06a1609a00b08"),
"details" : { "Name" : "David", "Age" : 22 }
}
คำอธิบาย:
$objectToArray: "$$ROOT"แปลงเอกสารทั้งฉบับ (รวม _id, details ฯลฯ) เป็นอาร์เรย์ [{k,v}, ...]$matchค้นหาในอาร์เรย์ UnknownKeys ว่ามี v.Name = "David" หรือไม่$projectซ่อนฟิลด์ช่วย UnknownKeys ออกจากผลลัพธ์
เหมาะสำหรับสคีม่าไม่คงที่ (Schema-less) ที่ชื่อฟิลด์เปลี่ยนแปลงได้