MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongodb $where query sempre true con nodejs

Prima di tutto, tieni presente che il $where l'operatore non dovrebbe quasi mai essere utilizzato per i motivi spiegati qui (il merito va a @WiredPrairie).

Tornando al tuo problema, l'approccio che vorresti adottare non funzionerà nemmeno nella shell mongodb (che consente esplicitamente funzioni js nude con $where operatore). Il codice javascript fornito a $where operatore viene eseguito sul server mongo e non avrà accesso all'ambiente circostante (i "collegamenti di contesto").

> 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
}

Inoltre sembra che il driver mongo nativo node.js si comporti in modo diverso dalla shell in quanto non serializza automaticamente una funzione js fornita nell'oggetto query e invece probabilmente elimina del tutto la clausola. Questo ti lascerà con l'equivalente di timetables.find({}) che restituirà tutti i documenti della collezione.