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

Chiamare la funzione db.system.js in $where

Ti stai connettendo allo stesso spazio dei nomi del database nel tuo codice PHP a cui ti sei connesso usando la shell? Penso di no!

Comunque fraintendete il concetto di $where in questo contesto, poiché puoi solo valutare e non ritorno risultati modificati diversi dai dati già contenuti nella raccolta.

Le uniche cose che possono effettivamente restituire qualcosa di diverso dai documenti esistenti sono .mapReduce() e .aggregate() .

Quindi, per dimostrare, nello "stesso spazio dei nomi" se definisci una raccolta:

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

E quindi esegui un .mapReduce()

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

Questo sarebbe ritorno un risultato sommato effettivo:

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

Tutto quel $where può fare, è "logicamente" selezionare il documento:

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

Che non soddisferebbe la condizione.

Ma ovviamente non è necessario farlo e, ove possibile, dovresti generalmente evitare qualsiasi esecuzione di JavaScript sul server. È molto più lento degli operatori nativi e puoi fare un bel po' con gli operatori nativi.

Quindi invece di .mapReduce() chiama .aggregate() :

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

E invece della valutazione JavaScript, chiama .aggregate() di nuovo, con $redact per il filtraggio "logico":

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

Quindi nella maggior parte dei casi c'è sempre un'alternativa migliore all'utilizzo della valutazione JavaScript. E certamente ci sono davvero pochissimi casi in cui sono davvero necessarie funzioni memorizzate sul server nei casi in cui è effettivamente richiesta la valutazione JavaScript.

Ma il tuo errore di base qui sarà perché la funzione si trovava in uno spazio dei nomi diverso o addirittura che hai riavviato il server nel mezzo. Ma il punto generale è che probabilmente non dovresti comunque usare le funzioni memorizzate.