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.