2013-01-12 19 views
5

Ich habe diese Dokumente in einer Sammlung:aus verschiedenen Dokumenten in MongoDB

{topic : "a", 
    messages : [ObjectId("21312321321323"),ObjectId("34535345353"),...] 
    }, 
    {topic : "b, 
    messages : [ObjectId("1233232323232"),ObjectId("6556565656565"),...] 
    } 

Gibt es eine Möglichkeit sich ein Ergebnis mit der Kombination von Nachrichten Felder zu bekommen? Ich mag diese zum Beispiel bekommen:

 {[ 
     ObjectId(""),ObjectId(""),ObjectId(""),ObjectId("") 
    ]} 

Ich dachte, dass dies möglich war, mit MapReduce aber in meinem Fall die Dokumente haben nichts gemeinsam. Im Moment mache ich das im Backend mit Javascript und Loops, aber ich denke, das ist nicht die beste Option. Vielen Dank.

Antwort

4

Sie könnten den $group Operator in Aggregation Framework verwenden. Um das Aggregation Framework zu verwenden, sollten Sie natürlich sicher sein, dass Sie auf MongoDB 2.2 oder neuer laufen.

Bei Verwendung mit $push erhalten Sie alle Listen von Nachrichten miteinander verkettet.

db.myCollection.aggregate({ $group: { messages: { $push: '$messages' } } }); 

Wenn mit $addToSet verwendet werden nur die unterschiedlichen Werte bekommen.

db.myCollection.aggregate({ $group: { messages: { $addToSet: '$messages' } } }); 

Und wenn Sie die Kandidaten Dokumente zuerst unten filtern möchten, können Sie $match verwenden.

db.myCollection.aggregate([ 
    { $match: { topic: { $in: [ 'a', 'b' ] } } }, 
    { $group: { matches: { $sum: 1 }, messages: { $push: '$messages' } } } 
]); 
+0

Danke, ich denke, das wird funktionieren, ich aktualisieren meine Mongodb. –

1

Eine Option ist die Verwendung des Aggregationsframeworks.

Wenn Sie jedoch eine große Anzahl von Ergebnissen planen (über ein "leichtes" Ergebnis hinaus), ein Ergebnisdokument mit mehr als 16 MB Größe oder übermäßig viel Systemspeicher benötigen, müssen Sie nur eine Schleife durchlaufen die Objekte in der Sammlung und verketten die Ergebnisse manuell (wie Sie vorschlagen, dass Sie jetzt tun) oder riskieren mongodb eine Ausnahme zu werfen.

Aggregation Grenzen kann am Ende dieser Seite zu finden:

http://docs.mongodb.org/manual/applications/aggregation/

die Einschränkungen gegeben, können Sie nur find mit einem Vorsprung verwenden nur messages zurückzukehren.

(Und mit so etwas würde ich Ihnen dringend einige Leistungsbenchmarks empfehlen, um Optionen mit Ihren Daten auf Ihren Servern zu vergleichen, da das "Internet" jetzt vermuten lässt, dass einige Leute die Aggregationsunterstützung langsamer finden als andere Techniken).

+0

Ja, das Aggregations-Framework unterliegt Einschränkungen. Die richtige Lösung, insbesondere im Maßstab, erfordert Abwägungsabwägungen. Selbst wenn Sie die Framework-Einschränkungen nicht einhalten, ist es möglicherweise besser skalierbar, Listen in Ihrem Client statt im Datenbankserver zusammenzuführen. – jared

Verwandte Themen