Denken Sie zunächst daran, dass $where
Operator sollte aus den hier erläuterten Gründen fast nie verwendet werden (Dank geht an @WiredPrairie).
Zurück zu Ihrem Problem, der Ansatz, den Sie wählen möchten, funktioniert nicht einmal in der mongodb-Shell (die explizit nackte js-Funktionen mit $where
zulässt Operator). Der für $where
bereitgestellte Javascript-Code -Operator wird auf dem Mongo-Server ausgeführt und hat keinen Zugriff auf die einschließende Umgebung (die "Kontextbindungen").
> 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
}
Darüber hinaus sieht es so aus, als verhalte sich der native Mongo-Treiber von node.js anders als die Shell, da er eine js-Funktion, die Sie im Abfrageobjekt bereitstellen, nicht automatisch serialisiert und stattdessen die Klausel wahrscheinlich ganz löscht. Damit erhalten Sie das Äquivalent von timetables.find({})
wodurch alle Dokumente in der Sammlung zurückgegeben werden.