Đây là một chủ đề thực sự khó hiểu. Tôi làm việc ở 10gen và tôi đã phải dành một khoảng thời gian để quấn lấy nó;)
Hãy xem qua cách công cụ truy vấn xử lý truy vấn này.
Đây là truy vấn một lần nữa:
> db.test.find({ b : { $gt : 4, $lt : 6}});
Khi nó đến bản ghi có vẻ như nó không khớp ...
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }
So khớp không được thực hiện đối với từng phần tử của mảng, mà là đối với toàn bộ mảng.
Việc so sánh được thực hiện theo ba bước:
Bước 1 :Tìm tất cả các tài liệu trong đó b có giá trị lớn hơn 4
b:[2,4,6,8] phù hợp vì 6 &8 lớn hơn 4
Bước 2 :Tìm tất cả các tài liệu trong đó b có giá trị nhỏ hơn 6
b:[2,4,6,8] phù hợp vì 2 &4 nhỏ hơn 6
Bước 3 :Tìm bộ tài liệu phù hợp ở cả bước 1 &2.
Tài liệu có b:[2,4,6,8] khớp với cả hai bước 1 và 2 nên nó được trả về dưới dạng khớp. Lưu ý rằng kết quả cũng được loại bỏ trùng lặp trong bước này, do đó, cùng một tài liệu sẽ không được trả lại hai lần.
Nếu bạn muốn truy vấn của mình áp dụng cho các phần tử riêng lẻ của mảng, thay vì toàn bộ mảng, bạn có thể sử dụng toán tử $ elemMatch. Ví dụ
> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
{ "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }