sql >> Databasteknik >  >> NoSQL >> MongoDB

Anropar db.system.js Funktion i $where

Ansluter du till samma databasnamnområde i din PHP-kod som du kopplade till med hjälp av skalet? Jag tror inte!

Hur som helst missförstår du begreppet $where i detta sammanhang, eftersom du bara kan utvärdera och inte returnera andra modifierade resultat än de data som redan finns i samlingen.

Det enda som faktiskt kan returnera något annat än de befintliga dokumenten är .mapReduce() och .aggregate() .

Så för att demonstrera, i "samma namnutrymme" om du definierar en samling:

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

Och kör sedan 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 skulle återvända ett faktiskt summerat resultat:

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

Allt det där $where kan göra, är "logiskt" att välja dokumentet:

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

Vilket inte skulle uppfylla villkoret.

Men naturligtvis behöver du verkligen inte göra detta, och bör generellt undvika all serverexekvering av JavaScript där det är möjligt. Det är mycket långsammare än inbyggda operatorer, och du kan göra en hel del med inbyggda operatorer.

Så istället för .mapReduce() anrop .aggregate() :

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

Och istället för JavaScript-utvärdering, anrop .aggregate() igen, med $redact för "logisk" filtrering:

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

Så i de flesta fall finns det alltid ett bättre alternativ till att använda JavaScript-utvärdering. Och visst finns det faktiskt väldigt få fall som verkligen behöver serverlagrade funktioner i de fall där JavaScript-utvärdering faktiskt krävs.

Men ditt grundläggande fel här kommer att bero på att funktionen var i ett annat namnområde, eller att du startade om servern däremellan. Men den övergripande poängen är att du förmodligen inte borde använda lagrade funktioner ändå.




  1. Vilket är det bästa sättet att använda Redis i en multi-threaded Rails-miljö? (Puma / Sidekiq)

  2. Får fel när jag installerar MongoDB på RedHat

  3. Få meddelande om ändrade dokument i mongodb

  4. Flaska efter exempel – Implementera en Redis-uppgiftskö