Първо, имайте предвид, че $where
операторът почти никога не трябва да се използва поради причините, обяснени тук (заслугата е на @WiredPrairie).
Обратно към проблема ви, подходът, който искате да предприемете, няма да работи дори в mongodb обвивката (която изрично позволява голи js функции с $where
оператор). Кодът на JavaScript, предоставен на $where
операторът се изпълнява на mongo сървъра и няма да има достъп до обграждащата среда („контекстните обвързвания“).
> 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
}
Освен това изглежда, че драйверът на mongo node.js се държи по различен начин от обвивката, тъй като не сериализира автоматично js функция, която предоставяте в обекта на заявката, и вместо това вероятно отпада клаузата напълно. Това ще ви остави еквивалента на timetables.find({})
което ще върне всички документи в колекцията.