Bạn có hai lựa chọn ở đây. Cách đầu tiên là sử dụng $where
nhà điều hành.
Collection.find( { $where: "this.start === this.end" } )
Tùy chọn thứ hai là sử dụng khung tổng hợp và $redact
nhà điều hành.
Collection.aggregate([
{ "$redact": {
"$cond": [
{ "$eq": [ "$start", "$end" ] },
"$$KEEP",
"$$PRUNE"
]
}}
])
$where
toán tử thực hiện đánh giá JavaScript và không thể tận dụng các chỉ mục, vì vậy hãy truy vấn bằng cách sử dụng $where
có thể làm giảm hiệu suất trong ứng dụng của bạn. Xem cân nhắc
. Nếu bạn sử dụng $ trong đó mỗi tài liệu của bạn sẽ được chuyển đổi từ BSON sang đối tượng JavaScript trước thao tác $ where, sẽ làm giảm hiệu suất. Tất nhiên truy vấn của bạn có thể được cải thiện nếu bạn có bộ lọc chỉ mục. Ngoài ra, có nguy cơ bảo mật nếu bạn đang tạo truy vấn động dựa trên thông tin người dùng nhập vào.
$redact
như $where
không sử dụng chỉ mục và thậm chí thực hiện quét bộ sưu tập, nhưng hiệu suất truy vấn của bạn được cải thiện khi bạn $redact
bởi vì nó là một toán tử MongoDB tiêu chuẩn. Điều đó được cho là tùy chọn tổng hợp tốt hơn nhiều vì bạn luôn có thể lọc tài liệu của mình bằng cách sử dụng toán tử so khớp $.
$where
ở đây là tốt nhưng có thể tránh được. Ngoài ra, tôi tin rằng bạn chỉ cần $where
khi bạn gặp vấn đề về thiết kế lược đồ. Ví dụ, thêm một trường boolean khác vào tài liệu có chỉ mục có thể là một lựa chọn tốt ở đây.