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

ค้นหาเอกสารเมื่อไม่รู้ชื่อฟิลด์ (Unknown Keys) ใน MongoDB

ใช้ $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 }
}

คำอธิบาย:

  1. $objectToArray: "$$ROOT" แปลงเอกสารทั้งฉบับ (รวม _id, details ฯลฯ) เป็นอาร์เรย์ [{k,v}, ...]
  2. $match ค้นหาในอาร์เรย์ UnknownKeys ว่ามี v.Name = "David" หรือไม่
  3. $project ซ่อนฟิลด์ช่วย UnknownKeys ออกจากผลลัพธ์

เหมาะสำหรับสคีม่าไม่คงที่ (Schema-less) ที่ชื่อฟิลด์เปลี่ยนแปลงได้