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

Scalanie dwóch kolekcji w MongoDB

Jest to podobne do pytania zadanego w Grupach dyskusyjnych Google dla użytkowników MongoDB.
https://groups.google.com/group/mongodb-user/browse_thread/thread/60a8b683e2626ada?pli=1

Odpowiedź odnosi się do samouczka on-line, który wygląda podobnie do twojego przykładu:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

Więcej informacji na temat MapReduce w MongoDB można znaleźć w dokumentacji:http://www.mongodb.org/display/DOCS/MapReduce

Ponadto w sekcji „Dodatki” w artykule MongoDB Cookbook zatytułowanym „Znajdowanie wartości maksymalnych i minimalnych za pomocą wersjonowanych dokumentów” znajduje się przydatny przewodnik krok po kroku dotyczący działania operacji MapReduce:http://cookbook.mongodb. org/patterns/finding_max_and_min/

Wybacz mi, jeśli przeczytałeś już niektóre z przywołanych dokumentów. Dołączyłem je z myślą o innych użytkownikach, którzy mogą czytać ten post i są nowicjuszami w korzystaniu z MapReduce w MongoDB

Ważne jest, aby dane wyjściowe z instrukcji „emit” w funkcjach Map były zgodne z danymi wyjściowymi funkcji Reduce. Jeśli istnieje tylko jeden dokument wyjściowy funkcji Map, funkcja Zmniejsz może w ogóle nie zostać uruchomiona, a zbiór wyników będzie zawierał niezgodne dokumenty.

Nieznacznie zmodyfikowałem instrukcje map, aby emitowały dokumenty w formacie żądanych danych wyjściowych, z dwiema oddzielnymi tablicami „klas”. one już nie istnieją.

var mapDetails = function(){
    var output = {studentid: this.studentid, classes_1: [], classes_2: [], year: this.year, overall: 0, subscore: 0}
    if (this.year == 1) {
        output.classes_1 = this.classes;
    }
    if (this.year == 2) {
        output.classes_2 = this.classes;
    }
    emit(this.studentid, output);
};

var mapGpas = function() {
    emit(this.studentid, {studentid: this.studentid, classes_1: [], classes_2: [], year: 0, overall: this.overall, subscore: this.subscore});
};

var r = function(key, values) {
    var outs = { studentid: "0", classes_1: [], classes_2: [], overall: 0, subscore: 0};

    values.forEach(function(v){
        outs.studentid = v.studentid;
        v.classes_1.forEach(function(class){if(outs.classes_1.indexOf(class)==-1){outs.classes_1.push(class)}})
        v.classes_2.forEach(function(class){if(outs.classes_2.indexOf(class)==-1){outs.classes_2.push(class)}})

        if (v.year == 0) {
            outs.overall = v.overall;
            outs.subscore = v.subscore;
        }
    });
    return outs;
};

res = db.details.mapReduce(mapDetails, r, {out: {reduce: 'joined'}})
res = db.gpas.mapReduce(mapGpas, r, {out: {reduce: 'joined'}})

Uruchomienie dwóch operacji MapReduce daje w wyniku następującą kolekcję, która pasuje do żądanego formatu:

> db.joined.find()
{ "_id" : "12345a", "value" : { "studentid" : "12345a", "classes_1" : [ 1, 17, 19, 21 ], "classes_2" : [ 32, 91, 101, 217 ], "overall" : 97, "subscore" : 1 } }
{ "_id" : "24680a", "value" : { "studentid" : "24680a", "classes_1" : [ 1, 11, 18, 22 ], "classes_2" : [ ], "overall" : 76, "subscore" : 2 } }
{ "_id" : "98765a", "value" : { "studentid" : "98765a", "classes_1" : [ 2, 12, 19, 22 ], "classes_2" : [ 32, 99, 110, 215 ], "overall" : 85, "subscore" : 5 } }
>

MapReduce zawsze wypisuje dokumenty w postaci {_id:"id", value:"value"}Więcej informacji na temat pracy z dokumentami podrzędnymi znajduje się w dokumencie zatytułowanym "Notacja punktowa (sięganie do obiektów)":http:/ /www.mongodb.org/display/DOCS/Dot+Notation+%28Docieranie+do+obiektów%29

Jeśli chcesz, aby dane wyjściowe MapReduce były wyświetlane w innym formacie, musisz to zrobić programowo w swojej aplikacji.

Mamy nadzieję, że poprawi to Twoje zrozumienie MapReduce i przybliży Cię o krok do stworzenia pożądanej kolekcji wyjściowej. Powodzenia!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Transakcja Mongodb v4.0, MongoError:Numery transakcji są dozwolone tylko na członku zestawu replik lub mongos

  2. Eksportuj prawidłowy json z kolekcji mongodb

  3. Co to jest operator $unwind w MongoDB?

  4. Jak sprawdzić typ danych kolumny w SQL?

  5. Użycie operatora $slice do pobrania ostatniego elementu tablicy