2010-11-19 9 views
2

Ich habe eine mongodb Sammlung zu erzeugen, die unter Dokumente wie die, die hat:MongoDB aggregierte Daten ‚letzte Aktivität‘

[ 
    { 
    :event => {:type => 'comment_created'}, 
    :item => {:id => 10}, 
    :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'} 
    } 

, 
    { 
    :event => {:type => 'vote_created'}, 
    :item => {:id => 10}, 
    :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'} 
    } 
] 

Was ich brauche, ist ein ‚Armaturenbrett‘ letzte Aktivität Aggregation aufbauen (am aktuellen Tag) für jeden Gegenstand. Das Ergebnis sollte so etwas wie sein:

{ 
:item_id => 10, 
:events => { 
    :vote_created => [.. ordered list with latest 3 vote_created events/documents], 
    :comment_created => [.. ordered list with latest 3 comment_created events/documents ], 
    } 
} 

Das Ergebnis verwendet wird, würde eine ‚Facebook-style‘ Syntax wie zu konstruieren: ". Mike, John und 3 andere hinzugefügt Kommentare zu Ihrem Artikel von heute

Wie kann ich diese Daten mit einer Gruppe oder einer Map-Reduce-Funktion zusammenfassen?

Antwort

4

OK, gibt es zwei Möglichkeiten, dies zu tun:

Methode # 1: Map-Reduce

Also zuerst, werden Sie ein Karten reduzieren ausgeführt werden soll, keine Gruppe.

Verwenden Sie Map-Reduce mit der Variablen "out", die eine neue Sammlung generiert. Sie können dann die Zusammenfassungsabfragen für diese neue Sammlung ausführen.

Der Grund, warum Sie dies tun, ist, dass Sie nach einer teuren Abfrage fragen, es ist also viel vernünftiger, auf "nicht ganz" in Echtzeit zuzugreifen.

Methode # 2: Doppelklicken schreibt

Sie grundsätzlich zwei Sammlungen beibehalten können "Details" (obere) und "Zusammenfassung" (untere). Wenn Sie die Details schreiben, führen Sie auch eine Aktualisierung der Zusammenfassung durch.

MongoDB verfügt über mehrere Array-Methoden ($push, $pull, $slice), die es ermöglichen sollten, das Array "vote_created" auf dem neuesten Stand zu halten.

Einstellungen

Die Methode, die Sie vollständig auswählen, hängt von der Art der Architektur, die Sie und die User Experience, die Sie wollen. Persönlich würde ich nur Methode 2 verwenden und einfach an das Array "vote_created" anhängen. Ich würde die "Mike, John und 3 andere ..." -Syntax irgendwo auf die Ansicht setzen, b/c ist es wirklich View-Logik nicht DB-Logik.

Ja Methode # 2 nimmt mehr Platz, aber es gibt Ihnen auch schnelle Antworten auf die Fragen, die Sie viel fragen. Du wirst also Platz opfern müssen, um diese Geschwindigkeit zu erreichen.

Verwandte Themen