Mặc dù có đề cập rằng thực sự $and
toán tử không bắt buộc, ở cả hai dạng, đây không phải là truy vấn mà bạn muốn. Hãy xem xét những điều sau:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Thực tế điều này không khớp với bản ghi đã cho vì có cả hai phần tử có giá trị "firstName" bằng "alice" và "lastName" bằng giá trị "jones". Nhưng tất nhiên vấn đề ở đây rất đơn giản là không có phần tử thực sự nào trong mảng có tài liệu con cho cả hai giá trị đó.
Để đối sánh nơi một phần tử mảng chứa "cả hai" tiêu chí đã cho, bạn cần sử dụng $elemMatch
nhà điều hành. Điều này áp dụng điều kiện truy vấn cho các "phần tử" của mảng.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
Và tất nhiên nếu bạn đã thử "alice" và "jones" thì điều đó sẽ không khớp vì không có phần tử nào thực sự chứa thao tác đó.