MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb $ where consulta sempre verdadeira com nodejs


Primeiramente, tenha em mente que o $where operador quase nunca deve ser usado pelos motivos explicados aqui (o crédito vai para @WiredPrairie).

De volta ao seu problema, a abordagem que você gostaria de seguir não funcionará mesmo no shell mongodb (que permite explicitamente funções js nuas com o $where operador). O código javascript fornecido ao $where O operador é executado no servidor mongo e não terá acesso ao ambiente envolvente (as "ligações de contexto").
> 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
}

Além disso, parece que o driver mongo nativo do node.js se comporta de maneira diferente do shell, pois não serializa automaticamente uma função js que você fornece no objeto de consulta e, em vez disso, provavelmente descarta a cláusula completamente. Isso deixará você com o equivalente a timetables.find({}) que devolverá todos os documentos da coleção.