Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Truy vấn MongoDB tìm nhiều điều kiện khớp trong mảng đối tượng

Để tìm tài liệu có phần tử mảng thỏa mãn NHIỀU ĐIỀU KIỆN cùng lúc, sử dụng $and kết hợp $elemMatch và $regex. Tạo collection:

> 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") }

Hiển thị dữ liệu:

> db.demo525.find();

Kết quả:

Tìm tài liệu có phần tử details thỏa MẤT Name BẮT ĐẦU bằng "Chris" (case-insensitive) VÀ CountryName BẮT ĐẦU bằng "us" (case-insensitive):

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

Kết quả khớp 2 tài liệu (Chris/US và chris/us):

Giải thích: $and đảm bảo CẢ HAI điều kiện phải đúng trên CÙNG MỘT phần tử mảng (nhờ $elemMatch). Nếu dùng 2 $elemMatch riêng biệt mà không có $and, có thể khớp 2 phần tử khác nhau trong cùng mảng.

Cách viết gọn hơn (MongoDB 3.6+): { "details": { $elemMatch: { Name: /^Chris/i, CountryName: /^us/i } } }