Hành vi này được mong đợi và giải thích trong tài liệu mongo tại đây .
Mongo dường như sẵn sàng chơi "tự mãn", bằng cách trả lại kết quả khi sự kết hợp của các phần tử mảng khớp với tất cả các điều kiện một cách độc lập.
Trong ví dụ của chúng tôi, 5 khớp với điều kiện $ lt:20 và 25 khớp với điều kiện $ gt:10. Vì vậy, đó là một trận đấu.
Cả hai cách sau sẽ trả về [5,25] kết quả:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Nếu đây là hành vi mong đợi của người dùng, các ý kiến có thể khác nhau. Nhưng nó chắc chắn đã được ghi lại, và cần được mong đợi.
Chỉnh sửa , đối với bản chỉnh sửa tàn bạo nhưng mang tính giáo dục cao của Neil cho câu trả lời ban đầu, yêu cầu giải pháp:
Sử dụng $ elemMatch có thể thực hiện so sánh phần tử "chặt chẽ hơn" cho chỉ mảng .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Lưu ý :điều này sẽ khớp với cả x:[11,12] và x:[11,25]
Tôi tin rằng khi cần một truy vấn như thế này, sự kết hợp trên hai truy vấn là bắt buộc, và kết quả được kết hợp. Dưới đây là truy vấn trả về kết quả chính xác cho các tài liệu có x không phải là mảng :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Nhưng cách tiếp cận tốt nhất trong trường hợp này là thay đổi loại x thành luôn luôn là một mảng, ngay cả khi nó chỉ chứa một phần tử. Sau đó, chỉ truy vấn $ elemMatch là bắt buộc để nhận được kết quả chính xác, với hành vi được mong đợi.