2016-08-16 2 views
2

i MapReduce Programm in MongoDB versuche gemeinsamen Freund zu finden, ich habe folgende Daten erhalten wird, nachdem der Schlüssel in mongoDB SortierungGruppendaten durch ihre Schlüssel in MapReduce MongoDB

{"user" : " Hari","friend" : "Shiva", 
"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]} 


{"user" : "Hari","friend" : " Shiva", 
    "friendList" : ["Karma"," Tom"," Ram"," Bindu"," Shiva", 
        " Kishna"," Bikash"," Bakshi"," Dinesh"]} 

hier Jetzt i gruppieren möchten diese Daten eingestellt Haben Sie den gleichen Schlüssel in einer einzigen Gruppe, verwenden Sie Javascript in der Kartenfunktion, bevor Sie Schlüssel/Wert-Paare an die Reduzierungen senden. Wie kann ich Daten gruppieren? Zum Beispiel möchte ich eine Ausgabe wie

{"user" : " Hari","friend" : "Shiva", 
"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"],["Karma"," Tom"," Ram"," Bindu"," Shiva"," Kishna"," Bikash"," Bakshi"," Dinesh"]} 

Antwort

1

Sie die friendlist Array der beiden Datensätze in einem einzigen Array verketten kann ein Objekt wie folgt zu erstellen:

{ 
    "_id": { 
    "user": " Hari", 
    "friend": "Shiva" 
    }, 
    "value": { 
    "friendList": [ 
     "Hanks", 
     " Tom", 
     " Karma", 
     " Hari", 
     " Dinesh", 
     "Karma", 
     " Tom", 
     " Ram", 
     " Bindu", 
     " Shiva", 
     " Kishna", 
     " Bikash", 
     " Bakshi", 
     " Dinesh" 
    ] 
    } 
} 

Sehen Sie den Code in https://jsfiddle.net/b6hxswvk/1/ dieses Einzel zu erstellen Objekt

Wenn Sie die friendlist sein, um einen 2-dimensionalen Array wie folgt also wollen:

{ 
    "_id": { 
    "user": " Hari", 
    "friend": "Shiva" 
    }, 
    "value": { 
    "friendList": [ 
     [ 
     "Hanks", 
     " Tom", 
     " Karma", 
     " Hari", 
     " Dinesh" 
     ], 
     [ 
     "Karma", 
     " Tom", 
     " Ram", 
     " Bindu", 
     " Shiva", 
     " Kishna", 
     " Bikash", 
     " Bakshi", 
     " Dinesh" 
     ] 
    ] 
    } 
} 

können Sie den Code in https://jsfiddle.net/b6hxswvk/2/

+0

hier erwartete Ergebnis möchte ich Ausgang, wie ich oben mit zwei Array zeigen und ich bin mit Javascript für mapreduce Funktionen und i dont mehr in JavaScript, also kann ich es bekommen wie oben formatiert? – bikas

+0

Dies ist nicht gültig JSON: '{" friendList ": [" Hanks "," Tom "," Karma "," Hari "," Dinesh "], [" Karma "," Tom "," Ram "," Bindu "," Shiva "," Kishna "," Bikash "," Bakshi "," Dinesh "]} so habe ich ein einzelnes verkettetes Array erstellt. Bitte geben Sie ein gültiges JSON für die finale 'Freundschaftsliste' an. – Dhananjay

+0

Siehe auch die bearbeitete Antwort, um eine 2 dimensionale' friendList' zu erstellen. – Dhananjay

0

Freund verwenden, Warum Sie den Schmerz der Gruppierung der Datenwerte für einen gleichen Schlüssel nehmen wollen, wenn die Karte, um diese auftreten werden reduzieren, indem die Werte der gleichen Tonart Gruppierung und geben auf das Reduzieren als Schlüssel, Liste [Werte]?

Ich empfehle dringend, die Gruppierungsaufgabe in Ihrem Reducer anstelle von Map durchzuführen. Der Hauptgrund dafür ist, dass, da der Karten-Task Datensatz für Datensatz liest und den Sammelvorgang durchführt, die Last zur Identifizierung der gleichen Schlüsselgruppen vom Algorithmus übernommen wird und wie die Ausgabe mit gruppierten Werten gestaltet werden kann Logik

können Sie die Ausgabe des Reducer für Ihre weitere Verarbeitung nehmen.

Eingang:

{"_id" : {"user" : " Hari","friend" : "Shiva"}, 
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]}} 


{"_id" : {"user" : "Hari","friend" : " Shiva"}, 
    "value" : {"friendList" : ["Karma"," Tom"," Ram"," Bindu"," Shiva", 
          " Kishna"," Bikash"," Bakshi"," Dinesh"]}} 

MapReduce-Code:

var mapper = function() { 
    var key = {"user" : this.user, "friend" : this.friend}; 
    emit(key, {"value":{"friendList":this.friendList}}); 
}; 

var reducer = function(key, value){ 
var combinedfriendList = {"friendList":[]}; 

    for (var i in values) { 
     var inter = values[i]; 
     for (var j in inter.friendList) { 
      combinedfriendList.friendList.push(inter.friendList[j]); 
     } 
    } 
return {"_id": {"user":key.user, "friend": key.friend}, "value":combinedfriendList}; 
}; 

Erwartete Ausgabe:

{"_id" : {"user" : " Hari","friend" : "Shiva"}, 
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh","Karma"," Tom"," Ram"," Bindu"," Shiva"," Kishna"," Bikash"," Bakshi"," Dinesh"]}} 

Hope this ist für einige Hilfe. Sie können es in Ihrer Umgebung testen (ändern Sie, wenn nötig) und teilen Sie Ihr Feedback.

+0

Ich habe versucht, aber ich konnte nicht bekommen, was ich will ..... ich denke du wirst klar sein was ich tue ... http: //stackoverflow.com/questions/38949291/group-document-by-their-key-in-monogodb-mapreduce ... Ich schätze Ihre Hilfe sehr mein Freund .. – bikas

+0

http://stackoverflow.com/questions/39003704/mutual-friend-using-mapreduce-in-mongodb – bikas

+0

@bikas bitte beziehen Sie sich auf meine Rezenter Kommentare in http://stackoverflow.com/questions/39003704/mutual-friend-using-mapreduce-in-mongodb, hoffe das könnte helfen – Aditya

1

Sie können einfach aggregation tun, wo Sie Felder $group basierend auf Benutzer und Freund tun kann.

db.collection.aggregate([ 
{$group:{ 
_id:{ 
     user:'$user', 
     friend:'$friend' 
    }, 
    friendList:{$push:'$friendList'} 
}}, 

// project the fields as your wish 
{$project:{ 
    user:'$_id.user', 
    friend:'$_id.friend', 
    friendList:'$friendList' 
}} 
]) 

Hoffnung diese Aggregation Pipeline zurückkehren können Sie

Verwandte Themen