Mongodb aggregation ist $group, beschränken die Länge von array
Möchte ich der Gruppe alle Dokumente nach einem Feld, aber zum einschränken der Anzahl der Dokumente gruppiert, die für jeden Wert.
Jede Nachricht hat eine conversation_ID. Ich brauche, um die 10 oder kleinere Anzahl von Nachrichten für jeden conversation_ID.
Ich bin in der Lage, die Gruppe nach den folgenden Befehl ein, kann aber nicht herausfinden, wie die Einschränkung der
Anzahl der gruppierten Dokumente abgesehen von slicing-die Ergebnisse
Message.aggregate({'$group':{_id:'$conversation_ID',msgs:{'$push':{msgid:'$_id'}}}})
Wie begrenzen Sie die Länge der Nachrichten-array für jedes conversation_ID 10?
- Viel curlier Frage, als Sie vielleicht denken. Die große Sache ist SERVER-6074 und ähnlichen Themen. Das aggregation framework nicht unterstützt
$slice
oder Operationen zu "begrenzen" die Elemente geschoben. Aber es ist möglich, einfach nur schrecklich. - Nur stubmled auf SERVER-6074 nach ein bisschen googeln. So jetzt manuelle schneiden ist die einzige Möglichkeit?
- Nicht nur - option. Wie gesagt, großes Thema, so dauert es ein wenig zu erklären, den Prozess. Es wäre schön, wenn andere Operatoren zu tun, obwohl dies. Abstimmung für JIRA-issues
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das $slice-operator ist nicht eine aggregation Betreiber, so dass Sie nicht tun dies (wie ich vorgeschlagen, in dieser Antwort vor dem edit):
Neil ' s Antwort ist sehr ausführlich, Sie können jedoch einen etwas anderen Ansatz (wenn es passend zu Ihrem Anwendungsfall). Sie insgesamt Ihre Ergebnisse und deren Ausgabe in eine neue Sammlung:
Den $out Betreiber schreiben die Ergebnisse der aggregation zu einer neuen Kollektion. Sie können dann mit einem regulären Abfrage-Projekts Ihre Ergebnisse mit den $slice-operator:
Für diesen test Unterlagen:
Das Ergebnis wird sein:
Bearbeiten
Gut, offensichtlich ist dieser Ansatz nicht Maßstab mit riesigen Sammlungen. Aber, da Sie erwägen, die Verwendung von großen aggregation von Rohrleitungen oder großen map-reduce jobs, die Sie wahrscheinlich nicht verwenden diese für "real-time" Anforderungen.
Gibt es viele Nachteile dieses Ansatzes: 16 MB BSON begrenzen, wenn Sie große Dokumente mit aggregation, verschwenden Speicherplatz /memory mit Vervielfältigung, erhöhte disk-IO...
Die Vorteile dieses Ansatzes: seine einfach zu implementieren und damit leicht zu ändern. Wenn Sie Ihre Sammlung wird nur selten aktualisiert und Sie können diese "aus" - Kollektion wie ein cache. Auf diese Weise würden Sie nicht haben, führen Sie die aggregation Vorgang mehrere Male und konnte Sie dann auch unterstützen "real-time" client-Anfragen auf die "out" - Kollektion. Zum aktualisieren Ihrer Daten haben, können Sie in regelmäßigen Abständen tun, aggregation (z.B. in einem hintergrund-job, der jede Nacht läuft).
Wie es gesagt wurde in den Kommentaren dieses ist nicht ein einfaches problem, und es ist nicht eine perfekte Lösung für dieses (noch!). Ich zeigte Sie einem anderen Ansatz, die Sie verwenden können, ist es an Ihnen, zu bewerten und zu entscheiden, was am besten geeignete für Ihren Anwendungsfall.