sql >> Database >  >> NoSQL >> MongoDB

Twee collecties samenvoegen in MongoDB

Dit is vergelijkbaar met een vraag die werd gesteld in de Google Discussiegroepen van MongoDB-gebruikers.
https://groups.google.com/group/mongodb-user/browse_thread/thread/60a8b683e2626ada?pli=1

Het antwoord verwijst naar een online zelfstudie die lijkt op uw voorbeeld:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

Raadpleeg de documentatie voor meer informatie over MapReduce in MongoDB:http://www.mongodb.org/display/DOCS/MapReduce

Bovendien is er een handige stapsgewijze uitleg van hoe een MapReduce-bewerking werkt in de sectie "Extra's" van het MongoDB Cookbook-artikel met de titel "Maximale en minimale waarden zoeken met geversioneerde documenten":http://cookbook.mongodb. org/patterns/finding_max_and_min/

Vergeef me als u al enkele van de genoemde documenten hebt gelezen. Ik heb ze toegevoegd ten behoeve van andere gebruikers die dit bericht misschien lezen en nieuw zijn bij het gebruik van MapReduce in MongoDB

Het is belangrijk dat de outputs van de 'emit'-statements in de Map-functies overeenkomen met de outputs van de Reduce-functie. Als er slechts één document wordt uitgevoerd door de functie Kaart, wordt de functie Verkleinen mogelijk helemaal niet uitgevoerd en bevat uw uitvoerverzameling niet-overeenkomende documenten.

Ik heb uw kaartinstructies enigszins gewijzigd om documenten uit te zenden in het formaat van uw gewenste uitvoer, met twee afzonderlijke "klassen"-arrays.
Ik heb ook uw reduce-instructie herwerkt om nieuwe klassen toe te voegen aan de klassen_1 en klassen_2 arrays, alleen als ze bestaan ​​nog niet.

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

Het uitvoeren van de twee MapReduce-bewerkingen resulteert in de volgende verzameling, die overeenkomt met uw gewenste formaat:

> 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 voert documenten altijd uit in de vorm van {_id:"id", value:"value"}Er is meer informatie beschikbaar over het werken met subdocumenten in het document getiteld "Dot Notation (Reaching into Objects)":http:/ /www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

Als u wilt dat de uitvoer van MapReduce in een ander formaat verschijnt, moet u dat programmatisch in uw toepassing doen.

Hopelijk zal dit uw begrip van MapReduce verbeteren en u een stap dichter bij het produceren van uw gewenste uitvoerverzameling brengen. Veel succes!



  1. Hoe alle hosts toe te staan ​​tot een replicaset in mongodb

  2. Hoe u uw functie kunt bekijkenCompatibilityVersion in MongoDB

  3. MongoDB - Gegevens exporteren

  4. MongoNetworkError:kon geen verbinding maken met server [localhost:27017] bij eerste verbinding [MongoNetworkError:verbinding maken met ECONNREFUSED 127.0.0.1:27017]