Připojujete se ke stejnému jmennému prostoru databáze v kódu PHP, ke kterému jste se připojili pomocí shellu? Myslím, že ne!
Každopádně špatně chápete koncept $where
v tomto kontextu, protože můžete pouze hodnotit a ne vracet upravené výsledky jiné než data již obsažená v kolekci.
Jediné věci, které mohou ve skutečnosti vrátit něco jiného než stávající dokumenty, jsou .mapReduce()
a .aggregate()
.
Takže pro demonstraci, ve "stejném jmenném prostoru", pokud definujete kolekci:
db.djunk.insert({ "x": 1, "y": 2 })
A pak spusťte .mapReduce()
db.dbjunk.mapReduce(
function() {
emit(this._id, sum(this.x,this.y))
},
function() {}, // does nothing here where already unique
{ "out": { "inline": 1 } }
)
To by se vrátilo skutečný sečtený výsledek:
{
"_id" : ObjectId("571a9bb951d042a7a896fd92"),
"value" : 3
}
To vše $where
můžete "logicky" vybrat dokument:
db.djunk.find(function() {
return sum(this.x,this.y) > 3
})
Což by nesplňovalo podmínku.
Ale samozřejmě to opravdu nemusíte dělat a měli byste se obecně vyhnout jakémukoli spouštění JavaScriptu na serveru, kde je to možné. Je mnohem pomalejší než nativní operátory a s nativními operátory toho můžete udělat docela dost.
Takže místo .mapReduce()
volání .aggregate()
:
db.djunk.aggregate([
{ "$project": {
"total": { "$add": [ "$x", "$y" ] }
}}
])
A místo vyhodnocení JavaScriptu zavolejte .aggregate()
opět s $redact
pro "logické" filtrování:
db.djunk.aggregate([
{ "$redact": {
"$cond": {
"if": { "$gt": [ { "$add": [ "$x", "$y" ] }, 3 ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Takže ve většině případů vždy existuje lepší alternativa k použití hodnocení JavaScriptu. A ve skutečnosti existuje jen velmi málo případů, kdy skutečně potřebujete funkce uložené na serveru v případech, kdy je skutečně vyžadováno vyhodnocení JavaScriptu.
Ale vaše základní chyba zde bude, protože funkce byla v jiném jmenném prostoru, nebo že jste mezi tím restartovali server. Ale celkově jde o to, že byste pravděpodobně stejně neměli používat uložené funkce.