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

ค้นหาเอกสาร MongoDB ด้วยเงื่อนไขรวมหลายฟิลด์ (Multiple Combined Fields)

บทความนี้แนะนำการใช้ Operator $or ร่วมกับ find() เพื่อค้นหาเอกสารที่ตรงตาม เงื่อนไขใดเงื่อนไขหนึ่ง จากหลายเงื่อนไขที่เกี่ยวข้องกับหลายฟิลด์

สร้างข้อมูลตัวอย่าง

> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Robert","IsMarried":false});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd4fd1e2cba06f46efe9ef1") }
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Chris","IsMarried":true});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd4fd322cba06f46efe9ef2") }
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"David","IsMarried":true});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd4fd3b2cba06f46efe9ef3") }
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Carol","IsMarried":true});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd4fd452cba06f46efe9ef4") }

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

> db.findDocumentWithFilterDemo.find().pretty();
{
  "_id" : ObjectId("5cd4fd1e2cba06f46efe9ef1"),
  "ClientName" : "Robert",
  "IsMarried" : false
}
{
  "_id" : ObjectId("5cd4fd322cba06f46efe9ef2"),
  "ClientName" : "Chris",
  "IsMarried" : true
}
{
  "_id" : ObjectId("5cd4fd3b2cba06f46efe9ef3"),
  "ClientName" : "David",
  "IsMarried" : true
}
{
  "_id" : ObjectId("5cd4fd452cba06f46efe9ef4"),
  "ClientName" : "Carol",
  "IsMarried" : true
}

ค้นหาด้วย $or: ClientName ไม่ใช่ "Robert" OR IsMarried ไม่ใช่ false

> db.findDocumentWithFilterDemo.find({
  $or: [
    { "ClientName": { $ne: "Robert" } },
    { "IsMarried": { $ne: false } }
  ]
});

ผลลัพธ์

{
  "_id" : ObjectId("5cd4fd322cba06f46efe9ef2"),
  "ClientName" : "Chris",
  "IsMarried" : true
}
{
  "_id" : ObjectId("5cd4fd3b2cba06f46efe9ef3"),
  "ClientName" : "David",
  "IsMarried" : true
}
{
  "_id" : ObjectId("5cd4fd452cba06f46efe9ef4"),
  "ClientName" : "Carol",
  "IsMarried" : true
}

คำอธิบาย Logic

Query นี้คืนค่าเอกสารที่ ตรงตามเงื่อนไขอย่างน้อย 1 ข้อ:

  • ClientName ไม่ใช่ "Robert" (Chris, David, Carol ตรง)
  • IsMarried ไม่ใช่ false (Chris, David, Carol ตรง)

เอกสารของ Robert (IsMarried: false) ไม่ตรง ทั้งสองเงื่อนไข จึงถูกตัดออก

เทคนิคเพิ่มเติม: รวม $or และ $and

// หา: (ClientName = "Chris" OR ClientName = "David") AND IsMarried = true
db.collection.find({
  $and: [
    { $or: [{ "ClientName": "Chris" }, { "ClientName": "David" }] },
    { "IsMarried": true }
  ]
});