sql >> Databasteknik >  >> NoSQL >> MongoDB

MapReduce-funktion i MongoDB - Gruppera dokument efter ID

Under din inlärning kanske du har missat huvudmanualsidan på mapReduce . Det finns en viktig del information som du antingen missat eller inte har läst och lärt dig:

Och så lite efter det:

Så vad det i princip betyder är att eftersom "reduceraren" faktiskt inte bearbetar "alla" de unika nycklarna på en gång, förväntar den sig samma "input" som den ger "output", eftersom den utmatningen kan matas tillbaka till reduceraren igen.

Av samma anledning måste "mapparen" mata ut exakt vad som förväntas som "reducer"-utgången, som också är reducer-"ingången". Så du "ändrar" faktiskt inte datastrukturen alls, utan bara "minskar" den istället.

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 hanterar du inmatningen som en array som också är utgången, sedan returneras de förväntade resultaten.

Nästa sak att lära sig är att i de flesta case mapReduce är inte riktigt vad du vill använda, och att du bör använda aggregationsramverk istället.

I motsats till mapReduce, använder detta "nativet kodade" operatorer och behöver ingen JavaScript-tolkning för att köras. Och det betyder till stor del att den är "snabbare" och ofta mycket enklare i konstruktionen.

Här är samma operation med .aggregate() :

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

Samma sak, mindre kodning och mycket snabbare.

Utmatning till en annan samling använder du $out :

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

För att ta reda på, här är mapReduce output:

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

Och den sammanlagda produktionen. Med den enda skillnaden från mapReduce _id och value Madatory output är att nycklarna är omvända, eftersom $group garanterar inte en order (men ses i allmänhet som en omvänd stack):

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


  1. JHipster Redis Integrationselement obundet fel

  2. MongoDB - Index används inte vid sortering och begränsning av avståndsfråga

  3. Hur kontrollerar man om samlingen finns i MongoDB med C#-drivrutinen?

  4. Lagring av kataloghierarki i ett datalager för nyckel-värde