sql >> Databáze >  >> NoSQL >> MongoDB

Funkce MapReduce v MongoDB - Seskupení dokumentu podle ID

Při učení jste možná přehlédli hlavní manuálovou stránku na mapReduce . Existuje jeden životně důležitý kus informací, které jste přehlédli nebo jste je nečetli a nedozvěděli se:

A pak o něco později:

V zásadě to tedy znamená, že protože „reduktor“ ve skutečnosti nezpracovává „všechny“ jedinečné klíče najednou, očekává stejný „vstup“ jako „výstup“, protože tento výstup lze vrátit zpět do znovu reduktor.

Ze stejného důvodu potřebuje „mapovač“ na výstupu přesně to, co se očekává jako výstup „reduktoru“, což je také „vstup reduktoru“. Datovou strukturu tedy vlastně vůbec „neměníte“, ale pouze ji „zmenšujete“.

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"}     
)

Nyní zacházíte se vstupem jako s polem, které je zároveň výstupem, pak se vrátí očekávané výsledky.

Další věc, kterou je třeba se naučit, je, že ve většině případy mapReduce není ve skutečnosti to, co chcete použít, a že byste měli používat rámec agregace místo toho.

Na rozdíl od mapReduce používá „native coded“ operátory a ke spuštění nepotřebuje interpretaci JavaScriptu. A to do značné míry znamená, že je „rychlejší“ a často mnohem jednodušší v konstrukci.

Zde je stejná operace s .aggregate() :

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

Totéž, méně kódování a mnohem rychlejší.

Výstup do jiné kolekce, kterou používáte $out :

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

Pro pořádek, zde je výstup mapReduce:

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

A souhrnný výstup. S jediným rozdílem od mapReduce _id a value povinným výstupem je, že klíče jsou obrácené, protože $group nezaručuje objednávku (ale je obecně vnímán jako obrácený zásobník):

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


  1. Mongoid::Versioning - jak zkontrolovat předchozí verze?

  2. Pole výsledků Mongoose/MongoDB jsou v JavaScriptu nedefinovaná

  3. Plánovač událostí (cronjob) v MongoDB?

  4. MongoDB InsertBatch JObject – Chyba serializace