Nó không hẳn đã hoạt động trong các phiên bản trước đó, vì ít nhất bạn đã sửa đổi phạm vi của this
bây giờ đề cập đến "dữ liệu" như một phần tử cấp cao nhất. Tóm lại, điều này không còn được phép nữa và bạn thực sự không nên sử dụng các phương thức JavaScript trừ khi bạn hoàn toàn phải làm như vậy. Ngay cả khi đó, có lẽ vẫn còn một cách tốt hơn trong hầu hết các trường hợp.
Nhưng trên thực tế, đây là cách sử dụng đối sánh JavaScript không cần thiết vì nó không bắt buộc khi có các toán tử khác sẽ thực hiện việc này.
Bạn nên sử dụng mã $ regex >
biểu mẫu thay thế:
db.docs.find({ "data.First_name": /^kim/i })
Hoặc bất kỳ nơi nào trong trường, hãy xóa dấu mũ ^
:
db.docs.find({ "data.First_name": /kim/i })
Điều này không hiệu quả tương đương với việc thực thi JavaScript nhưng không nhiều vì không có chi phí xử lý thông qua công cụ thông dịch đó. Và tất nhiên nó hoạt động ở mọi nơi.
Ngoài ra, hãy nghĩ về những gì một truy vấn dựa vào JavaScript để giải quyết đang thực sự làm:
- Gọi một phiên bản thông dịch JavaScript
- Chuyển đổi các loại tài liệu BSON trên mỗi tài liệu thành các loại JavaScript
- Đánh giá mã JavaScript trong trình thông dịch trên mỗi tài liệu
- Truyền JavaScript
true | false
kết quả trở lại trên mỗi tài liệu
Xem xét rằng $ regex
(nhưng với một đối sánh không phân biệt chữ hoa chữ thường không phải là tối ưu) đang thực hiện các thao tác tương tự nhưng sử dụng thư viện C "pcre" nguyên bản mà không cần chuyển đổi và ghi lại trên mỗi tài liệu, thì đó rõ ràng là lựa chọn lành mạnh của cả hai.