MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Funkcja MapReduce w MongoDB - Grupowanie dokumentu według ID

Podczas nauki mogłeś przegapić główną stronę podręcznika na mapReduce . Jest jeden istotny element informacji, które przegapiłeś lub których nie przeczytałeś i których nie poznałeś:

A potem trochę później:

Zasadniczo oznacza to, że ponieważ „reduktor” w rzeczywistości nie przetwarza „wszystkich” unikalnych kluczy naraz, oczekuje tego samego „wejścia”, co daje „wyjście”, ponieważ dane wyjściowe można ponownie reduktor.

Z tego samego powodu „mapper” musi wyprowadzać dokładnie to, czego oczekuje się od wyjścia „reduktora”, które jest również „wejściem” reduktora. Tak więc nie zmieniasz w ogóle struktury danych, ale po prostu ją „zmniejszasz”.

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

Teraz traktujesz dane wejściowe jako tablicę, która jest również danymi wyjściowymi, a następnie zwracane są oczekiwane wyniki.

Następną rzeczą, której należy się nauczyć, jest to, że w większości przypadki mapReduce nie jest tak naprawdę tym, czego chcesz użyć, i powinieneś używać struktura agregacji zamiast tego.

W przeciwieństwie do mapReduce, ten używa "kodowanych natywnie" operatorów i nie wymaga interpretacji JavaScript do uruchomienia. A to w dużej mierze oznacza, że ​​jest „szybszy” i często o wiele prostszy w budowie.

Oto ta sama operacja z .aggregate() :

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

To samo, mniej kodowania i dużo szybciej.

Wysyłając do innej kolekcji używasz $out :

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

Dla przypomnienia, oto dane wyjściowe mapReduce:

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

I zagregowana produkcja. Z jedyną różnicą w stosunku do mapReduce _id i value obowiązkowym wyjściem jest to, że klucze są odwrócone, ponieważ $group nie gwarantuje kolejności (ale jest zwykle obserwowany jako odwrócony stos):

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zmienić pole _id w kolekcji MongoDB na User_id?

  2. Jak niebezpieczne jest zapytanie mongo, które jest pobierane bezpośrednio z ciągu zapytania URL?

  3. Instalowanie MongoDB na CentOS 7

  4. utwórz obiekt nadrzędny, który zagnieździł dzieci w manguście

  5. Nie można połączyć powłoki Mongo z Mongo Atlas M0 za pomocą mongodb+srv