sql >> Database >  >> NoSQL >> MongoDB

De functie db.system.js aanroepen in $where

Maak je verbinding met dezelfde databasenaamruimte in je PHP-code waarmee je verbinding hebt gemaakt via de shell? Ik denk het niet!

Hoe dan ook, je begrijpt het concept van $where verkeerd in deze context, aangezien je alleen evalueren en niet terug gewijzigde resultaten anders dan de gegevens die al in de verzameling zijn opgenomen.

De enige dingen die daadwerkelijk iets anders kunnen retourneren dan de bestaande documenten zijn .mapReduce() en .aggregate() .

Dus om te demonstreren, in de "dezelfde naamruimte" als je een collectie definieert:

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

En voer vervolgens een .mapReduce() . uit

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

Dat zou terugkeren een daadwerkelijk opgeteld resultaat:

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

Al dat $where kan doen, is "logisch" het document selecteren:

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

Wat niet aan de voorwaarde zou voldoen.

Maar u hoeft dit natuurlijk niet te doen, en over het algemeen zou u waar mogelijk het uitvoeren van JavaScript door de server moeten vermijden. Het is veel langzamer dan native operators en je kunt behoorlijk wat doen met native operators.

Dus in plaats van .mapReduce() bel .aggregate() :

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

En in plaats van JavaScript-evaluatie, roept u .aggregate() . aan nogmaals, met $redact voor "logische" filtering:

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

Dus in de meeste gevallen is er altijd een beter alternatief voor het gebruik van JavaScript-evaluatie. En er zijn zeker heel weinig gevallen waarin op de server opgeslagen functies echt nodig zijn in gevallen waarin JavaScript-evaluatie echt vereist is.

Maar je basisfout hier is dat de functie zich in een andere naamruimte bevond, of dat je de server tussendoor opnieuw hebt opgestart. Maar het algemene punt is dat je waarschijnlijk toch geen opgeslagen functies zou moeten gebruiken.




  1. pymongo - hoe te matchen bij het opzoeken?

  2. Wat is Hadoop Mapper Class in MapReduce?

  3. Best practices voor databaseback-ups

  4. MongoDB installeren op Ubuntu 16.04