Tout d'abord, gardez à l'esprit que le $where
l'opérateur ne devrait presque jamais être utilisé pour les raisons expliquées ici (le crédit revient à @WiredPrairie).
Revenons à votre problème, l'approche que vous souhaitez adopter ne fonctionnera pas même dans le shell mongodb (qui autorise explicitement les fonctions js nues avec le $where
opérateur). Le code javascript fourni au $where
L'opérateur est exécuté sur le serveur mongo et n'aura pas accès à l'environnement englobant (les "liaisons de contexte").
> 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
}
De plus, il semble que le pilote mongo natif node.js se comporte différemment du shell en ce sens qu'il ne sérialise pas automatiquement une fonction js que vous fournissez dans l'objet de requête et qu'il supprime probablement complètement la clause. Cela vous laissera l'équivalent de timetables.find({})
qui renverra tous les documents de la collection.