2012-04-13 7 views
0

Ich habe ein Problem mit der Erstellung eines Mapreduce-Algorithmus, der mir die Statistiken liefert, die ich brauche. Ich habe ein Benutzerobjekt, das einen Post erstellen kann und ein Post kann viele Likes von anderen Benutzern haben.MapReduce auf untergeordnete Objekte, die nicht eingebettet sind

Benutzer
--post
---- Likes

Die Post in dem Benutzer nicht eingebettet ist, weil wir Beiträge separat und nicht nur in einem Benutzerkontext zuzugreifen. Die Statistik, die ich brauche, ist die Anzahl der Likes, die ein Autor bekommen hat, und ich muss das durch die Beiträge eines Benutzers herausfinden. Das Problem ist, dass die Posts nicht eingebettet sind, kann ich nicht auf sie in meiner Map-Funktion zugreifen. Hier ist die Karte und Funktionen reduzieren ich derzeit

def reputation_map 
<<-MAP 
    function() {  
     var posts = db.posts.find({user_id:this._id}); 
     emit(this._id, {posts:posts});  
    } 
MAP 
end 

def reputation_reduce 
    <<-REDUCE 
    function(key, values) { 
     var count = 0; 
     while(values.hasNext()){ 
     values.next(); 
     count+=1; 
     } 
     return {posts:count}; 
    } 
REDUCE 
end 

Dies sollte nur die Beiträge zurückkehren für jeden Benutzer so habe ich nicht einmal zu den Gleichen bekommen Ebene noch nicht, aber statt einer Zählung, dies gibt nur eine dbquery für Beiträge . Was ist der richtige Weg, dies zu tun?

+0

Graf likes per user_id (die in Post ist). Dann, falls erforderlich, ordnen Sie diese Benutzer-ID den Benutzern zu (in einer separaten Abfrage). –

+0

Ich bin mir nicht sicher, wie man sie in mapreduce abfragt, weil sie nicht eingebettet sind. – Slick86

+0

map-reduce über Beiträge, nicht Benutzer. Dann erhalten Sie in einer separaten Abfrage (nicht map-reduce) erweiterte Benutzerinformationen (falls erforderlich). –

Antwort

1

Map Reduce wurde entwickelt, um jeweils mit einer einzigen Sammlung zu arbeiten.

Technisch ist es möglich, eine separate Sammlung innerhalb einer Map-Funktion abzufragen, wie Sie es getan haben, aber seien Sie vorsichtig, da dies weder empfohlen noch unterstützt wird. Es kann zu Problemen kommen, besonders wenn die Sammlung geschichtet ist.

Eine ähnliche Frage wurde vor einiger Zeit gefragt: How to call to mongodb inside my map/reduce functions? Is it a good practice?

Wenn Sie Ergebnisse aus mehreren Sammlungen werden aggregiert, können Sie feststellen, dass der sicherste und geradlinig Weg, es zu tun in der Anwendung ist.

Wenn Likes pro Autor ein Wert ist, nach dem mit einer bestimmten Häufigkeit gesucht wird, ist es möglicherweise vorzuziehen, ihn als Wert in jedes Dokument aufzunehmen und für jedes Update ein wenig mehr Aufwand aufzuwenden, um diesen Wert zu erhöhen. anstatt periodisch eine potentiell ressourcenintensive Berechnung aller Stimmen pro Autor durchzuführen.

Hoffentlich gibt Ihnen das einige Denkanstöße für das Abrufen der Werte, die Sie benötigen.

Wenn Sie Hilfe bei der Erstellung eines Map Reduce-Vorgangs für eine einzelne Sammlung benötigen, ist die Community hier behilflich. Bitte fügen Sie ein Beispieleingabedokument und eine Beschreibung der gewünschten Ausgabe bei. Reduzieren Sie

Weitere Informationen auf der Karte, kann die Dokumentation hier: http://www.mongodb.org/display/DOCS/MapReduce

Zusätzlich gibt einige gute Map Beispiele reduzieren sind im MongoDB-Kochbuch: http://cookbook.mongodb.org/

Die „Extras“ -Abschnitt Der Kochbuchartikel "Max- und Minwerte mit versionierten Dokumenten finden" http://cookbook.mongodb.org/patterns/finding_max_and_min/ enthält eine gute Schritt-für-Schritt-Anleitung einer Map Reduce-Operation, in der die Ausführung der Funktionen erläutert wird.

Verwandte Themen