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

Llamando a la función db.system.js en $where

¿Se está conectando al mismo espacio de nombres de la base de datos en su código PHP al que se conectó usando el shell? ¡Creo que no!

De todos modos, no entiendes el concepto de $where en este contexto, ya que solo puedes evaluar y no volver resultados modificados que no sean los datos ya contenidos en la colección.

Las únicas cosas que realmente pueden devolver algo diferente a los documentos existentes son .mapReduce() y .aggregate() .

Entonces, para demostrar, en el "mismo espacio de nombres" si define una colección:

db.djunk.insert({ "x": 1, "y": 2 })

Y luego ejecute un .mapReduce()

db.dbjunk.mapReduce(
    function() {
        emit(this._id, sum(this.x,this.y))
    },
    function() {}, // does nothing here where already unique
    { "out": { "inline": 1 } }
)

Eso volvería un resultado sumado real:

{
    "_id" : ObjectId("571a9bb951d042a7a896fd92"),
    "value" : 3
}

Todo eso $where puede hacer, es "lógicamente" seleccionar el documento:

db.djunk.find(function() {
    return sum(this.x,this.y) > 3
})

Que no cumpliría la condición.

Pero, por supuesto, realmente no necesita hacer esto y, en general, debe evitar la ejecución de JavaScript en el servidor siempre que sea posible. Es mucho más lento que los operadores nativos y puede hacer bastante con los operadores nativos.

Así que en lugar de .mapReduce() llama a .aggregate() :

db.djunk.aggregate([
    { "$project": {
        "total": { "$add": [ "$x", "$y" ] }
    }}
])

Y en lugar de la evaluación de JavaScript, llame a .aggregate() de nuevo, con $redact para filtrado "lógico":

db.djunk.aggregate([
    { "$redact": {
        "$cond": {
            "if": { "$gt": [ { "$add": [ "$x", "$y" ] }, 3 ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }      
    }}
])

Entonces, en la mayoría de los casos, siempre hay una mejor alternativa para usar la evaluación de JavaScript. Y, ciertamente, hay muy pocos casos que realmente necesiten funciones almacenadas en el servidor en los casos en que realmente se requiere la evaluación de JavaScript.

Pero su error básico aquí será porque la función estaba en un espacio de nombres diferente, o de hecho, que reinició el servidor en el medio. Pero el punto general es que probablemente no debería usar funciones almacenadas de todos modos.