sql >> Databáze >  >> NoSQL >> MongoDB

Volání funkce db.system.js v $where

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.




  1. Node.js / Mongodb vložit zpětné volání vrací nedefinované

  2. Export modulu databáze mongoose

  3. Jak provedu ekvivalent SQL Join v MongoDB?

  4. ember js Association access backend nodejs mongoose