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

ค้นหาในอาร์เรย์ออบเจกต์ MongoDB หลายเงื่อนไขด้วย $and และ $regex

เมื่อต้องการค้นหาเอกสารที่อาร์เรย์ออบเจกต์มีเงื่อนไขตรงพร้อมกันหลายอย่าง (AND logic) ให้ใช้ $and ร่วมกับ $elemMatch และ $regex

> db.demo525.insertOne({"details": [{Name: "Chris", "CountryName": "US"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8ae5ef437efc8605595b66") }
> db.demo525.insertOne({"details": [{Name: "Bob", "CountryName": "UK"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8ae5f8437efc8605595b67") }
> db.demo525.insertOne({"details": [{Name: "chris", "CountryName": "us"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8ae602437efc8605595b68") }
> db.demo525.insertOne({"details": [{Name: "Mike", "CountryName": "UK"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8ae60b437efc8605595b69") }

แสดงข้อมูล:

> db.demo525.find();

คิวรีค้นหา Name เริ่มต้น "Chris" และ CountryName เริ่มต้น "us" (case-insensitive)

> db.demo525.find({
...   $and: [
...     {details: {$elemMatch: {Name: {$regex: new RegExp('^' + 'Chris', 'i')}}}},
...     {details: {$elemMatch: {CountryName: {$regex: new RegExp('^' + 'us', 'i')}}}}
...   ]
... });

ผลลัพธ์ - เจอ 2 รายการ (Chris/US และ chris/us):


คำอธิบาย

  • $and: ต้องตรงเงื่อนไขทั้งสองพร้อมกัน
  • $elemMatch: ต้องมีออบเจกต์ ตัวเดียวกัน ที่ตรงเงื่อนไขในอาร์เรย์
  • $regex + new RegExp: สร้าง regex แบบ dynamic พร้อม flag 'i' (case-insensitive)
  • ^Chris = เริ่มต้นด้วย Chris, ^us = เริ่มต้นด้วย us

ข้อสังเกต: ใช้ $elemMatch 2 ครั้งใน $and เพื่อให้มั่นใจว่า Name และ CountryName อยู่ใน ออบเจกต์ตัวเดียวกัน ในอาร์เรย์