Først skal du huske på, at $where
operatør bør næsten aldrig bruges af de årsager, der er forklaret her (kreditten går til @WiredPrairie).
Tilbage til dit problem, den tilgang, du gerne vil tage, fungerer ikke engang i mongodb-skallen (som eksplicit tillader nøgne js-funktioner med $where
operatør). Javascript-koden, der leveres til $where
operatør udføres på mongo-serveren og vil ikke have adgang til det omsluttende miljø ("kontekstbindingerne").
> 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
}
Desuden ser det ud til, at node.js native mongo-driveren opfører sig anderledes end skallen, idet den ikke automatisk serialiserer en js-funktion, du angiver i forespørgselsobjektet, og i stedet forsvinder den sandsynligvis klausulen helt. Dette vil efterlade dig med det, der svarer til timetables.find({})
som vil returnere alle dokumenter i samlingen.