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

Kalder db.system.js Funktion i $where

Opretter du forbindelse til det samme databasenavneområde i din PHP-kode, som du oprettede forbindelse til ved hjælp af shellen? Det tror jeg ikke!

I hvert fald misforstår du konceptet $where i denne sammenhæng, da du kun kan evaluere og ikke vende tilbage ændrede resultater ud over de data, der allerede er indeholdt i samlingen.

De eneste ting, der rent faktisk kan returnere noget andet end de eksisterende dokumenter, er .mapReduce() og .aggregate() .

Så for at demonstrere, i "samme navneområde", hvis du definerer en samling:

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

Og kør derefter en .mapReduce()

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

Det ville vende tilbage et faktisk opsummeret resultat:

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

Alt det $where kan gøre, er "logisk" at vælge dokumentet:

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

Hvilket ikke ville opfylde betingelsen.

Men du behøver selvfølgelig ikke gøre dette, og du bør generelt undgå enhver serverudførelse af JavaScript, hvor det er muligt. Det er meget langsommere end native operatorer, og du kan gøre en hel del med native operatorer.

Så i stedet for .mapReduce() kald .aggregate() :

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

Og i stedet for JavaScript-evaluering skal du kalde .aggregate() igen med $redact for "logisk" filtrering:

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

Så i de fleste tilfælde er der altid et bedre alternativ til at bruge JavaScript-evaluering. Og bestemt er der faktisk meget få tilfælde, hvor der virkelig er brug for serverlagrede funktioner i de tilfælde, hvor JavaScript-evaluering faktisk er påkrævet.

Men din grundlæggende fejl her vil være, fordi funktionen var i et andet navneområde, eller faktisk, at du genstartede serveren ind imellem. Men det overordnede punkt er, at du nok ikke skal bruge lagrede funktioner alligevel.




  1. Heroku prækompilerer ikke mine aktiver for at forberede min app til aktivpipeline

  2. Sådan bruger du ny URL fra mongodb 3.6 til at oprette forbindelse fra golang

  3. Ember, Ember Data og MongoDB's _id

  4. MongoDB Collection runCommand fra PHP