Để 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 } } }