sql >> Database >  >> NoSQL >> MongoDB

MapReduce-functie in MongoDB - Document groeperen op ID

Tijdens je studie heb je misschien de kernhandleiding op mapReduce . Er is één vitaal stuk van informatie die je hebt gemist of niet hebt gelezen en geleerd:

En dan een beetje daarna:

Dus wat dat in feite betekent, is dat, omdat de "reductor" niet "alle" unieke sleutels in één keer verwerkt, het dezelfde "invoer" verwacht als "uitvoer", omdat die uitvoer kan worden teruggevoerd naar het verloopstuk weer.

Om dezelfde reden moet de "mapper" precies uitvoeren wat wordt verwacht als de "reducer" -uitvoer, wat ook de "input" van de reducer is. U "verandert" de gegevensstructuur dus eigenlijk helemaal niet, maar "verkleint" deze in plaats daarvan.

db.Cool.mapReduce(
    function(){emit(this.id, { "cools": [this.cool] })},
    function(key, values){
        var res = [];
        values.forEach(function(cool){
            cool.cools.forEach(function(v) {
                res.push(v);
            });
        });
        return {cools: res};
    },
    {out: "MapReduce"}     
)

Nu behandel je de invoer als een array die ook de uitvoer is, dan worden de verwachte resultaten geretourneerd.

Het volgende dat u moet leren, is dat in de meeste cases mapReduce niet echt is wat je wilt gebruiken, en dat je de aggregatieraamwerk in plaats daarvan.

In tegenstelling tot mapReduce gebruikt dit "native coded" operators en heeft het geen JavaScript-interpretatie nodig om te worden uitgevoerd. En dat betekent grotendeels dat het "sneller" is en vaak een stuk eenvoudiger van constructie.

Hier is dezelfde bewerking met .aggregate() :

db.Cool.aggregate([
    { "$group": {
        "_id": "$id",
        "cools": { "$push": "$cool" }
    }}
])

Hetzelfde, minder coderen en een stuk sneller.

Uitvoer naar een andere verzameling die u gebruikt $out :

db.Cool.aggregate([
    { "$group": {
        "_id": "$id",
        "cools": { "$push": "$cool" }
    }},
    { "$out": "reduced" }
])

Voor de goede orde, hier is de output van mapReduce:

{ "_id" : "a", "value" : { "cools" : [ "a1", "a2" ] } }
{ "_id" : "b", "value" : { "cools" : [ "b1", "b2" ] } }
{ "_id" : "c", "value" : { "cools" : [ "c1" ] } }
{ "_id" : "d", "value" : { "cools" : [ "d1" ] } }

En de totale output. Met het enige verschil met de mapReduce _id en value verplichte uitvoer is dat de sleutels zijn omgekeerd, aangezien $group garandeert geen bestelling (maar wordt over het algemeen gezien als een omgekeerde stapel):

{ "_id" : "d", "cools" : [ "d1" ] }
{ "_id" : "c", "cools" : [ "c1" ] }
{ "_id" : "b", "cools" : [ "b1", "b2" ] }
{ "_id" : "a", "cools" : [ "a1", "a2" ] }


  1. Krijg min en max waarde in enkele zoekopdracht in mongodb

  2. Hoe bel ik mongodb in mijn kaart / reduceer-functies? Is het een goede gewoonte?

  3. Django-serialisatie naar JSON-fout:'MetaDict'-object heeft geen kenmerk 'concrete_model'

  4. Redis-verbinding/bufferlimiet overschreden