Sử dụng $where
nên tránh sử dụng toán tử trong hầu hết các trường hợp vì nó sẽ thực hiện quét toàn bộ bộ sưu tập bất kể điều kiện nào khác có thể sử dụng lựa chọn chỉ mục.
Ngoài ra, bạn đang gọi trình thông dịch JavaScript trên mỗi tài liệu kết quả, sẽ chậm hơn đáng kể so với mã gốc. Đọc các cảnh báo trên trang hướng dẫn sử dụng, chúng ở đó là có lý do
Nếu có thể, hãy thử sử dụng .aggregate()
cho kiểu so sánh này thay thế. Trong trường hợp của bạn, đó chắc chắn là lựa chọn tốt hơn:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Điều này cho phép bạn lọc truy vấn của mình trước tiên theo điều kiện "cờ" và sau đó kiểm tra từng thành viên của mảng để so sánh xem hai trường có giống nhau hay không.
Sau đó, nếu cần, bạn có thể cuộn lại các phần tử mảng đã khớp vào một mảng có nhiều hơn một phần tử phù hợp. Nhưng tôi không nghĩ đó là yêu cầu của bạn.