sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb $ donde la consulta siempre es verdadera con nodejs

En primer lugar, tenga en cuenta que $where operador casi nunca debe usarse por las razones que se explican aquí (el crédito es para @WiredPrairie).

Volviendo a su problema, el enfoque que le gustaría tomar no funcionará incluso en el shell mongodb (que permite explícitamente funciones js desnudas con $where operador). El código javascript proporcionado al $where El operador se ejecuta en el servidor mongo y no tendrá acceso al entorno adjunto (los "enlaces 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
}

Además, parece que el controlador mongo nativo de node.js se comporta de manera diferente al shell en el sentido de que no serializa automáticamente una función js que proporciona en el objeto de consulta y, en cambio, es probable que elimine la cláusula por completo. Esto te dejará con el equivalente de timetables.find({}) que devolverá todos los documentos de la colección.