Frage

Ich habe eine mongodb Sammlung, die Dokumente wie die, die unten:

[
  {
  :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‘ Aggregieren zuletzt aktiv (am aktuellen Tag) für jedes Element zu bauen. Das Ergebnis sollte so etwas wie:

{
: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 heute

Wie kann ich diese Daten aggregieren Funktion eine Gruppe oder eine Karten reduzieren mit?

War es hilfreich?

Lösung

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

Methode # 1: Map-Reduce

Also zuerst, sollten Sie eine Karte-reduce laufen, keine Gruppe.

Verwenden Sie Map-Reduce mit dem „out“ Variable, die eine neue Kollektion generieren. Sie werden dann in der Lage sein, um die Zusammenfassung von Abfragen gegen diese neue Kollektion laufen.

Der Grund, warum Sie dies tun, ist, dass Sie für eine teure Abfrage sind gefragt, so dass es viel vernünftiger ist es für den Zugriff auf „nicht ganz“ Echtzeit.

Methode 2: Doppelklicken schreibt

Sie können im Grunde zwei Sammlungen „Details“ (obere) und „Zusammenfassung“ (untere) halten. Jedes Mal, wenn Sie eine Schreib auf die Details machen, auch eine Aktualisierung der Zusammenfassung durchführen.

MongoDB hat mehrere Array-Methoden ( $ push, $ zu ziehen, $ slice ), das machen sollte es möglich die halten "vote_created" Array up-to-date.

Einstellungen

Die Methode, die Sie vollständig auswählen, hängt von der Art der Architektur, die Sie haben und die User Experience, die Sie wollen. Persönlich würde ich nur Methode verwenden # 2 und halten nur an das Anhängen von „vote_created“ Array. Ich würde den ‚Mike, John und 3 andere ...‘ setzt Syntax irgendwo auf der Ansicht, b / c es wirklich die Ansicht Logik nicht DB Logik.

Ja Methode # 2 braucht mehr Platz, aber es gibt Ihnen auch schnelle Antworten auf die Fragen, die Sie viel fragen. So wirst du Raum opfern müssen, dass die Geschwindigkeit zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top