MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb $where-Abfrage immer wahr mit nodejs

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.