Trước hết, hãy nhớ rằng $where
hầu như không bao giờ được sử dụng toán tử vì những lý do được giải thích ở đây (tín dụng được chuyển đến @WosystemPrairie).
Quay lại vấn đề của bạn, cách tiếp cận bạn muốn thực hiện sẽ không hoạt động ngay cả trong trình bao mongodb (cho phép rõ ràng các hàm js không có với $where
nhà điều hành). Mã javascript được cung cấp cho $where
toán tử được thực thi trên máy chủ mongo và sẽ không có quyền truy cập vào môi trường bao quanh ("liên kết ngữ cảnh").
> db.test.insert({a: 42})
> db.test.find({a: 42})
{ "_id" : ObjectId("5150433c73f604984a7dff91"), "a" : 42 }
> db.test.find({$where: function() { return this.a == 42 }}) // works
{ "_id" : ObjectId("5150433c73f604984a7dff91"), "a" : 42 }
> var local_var = 42
> db.test.find({$where: function() { return this.a == local_var }})
error: {
"$err" : "error on invocation of $where function:\nJS Error: ReferenceError: local_var is not defined nofile_b:1",
"code" : 10071
}
Hơn nữa, có vẻ như trình điều khiển mongo gốc node.js hoạt động khác với shell ở chỗ nó không tự động tuần tự hóa một hàm js mà bạn cung cấp trong đối tượng truy vấn và thay vào đó, nó có khả năng loại bỏ hoàn toàn mệnh đề. Điều này sẽ để lại cho bạn phần tương đương với timetables.find({})
sẽ trả về tất cả các tài liệu trong bộ sưu tập.