2016-10-30 4 views
1

Ich habe eine MongoDB-Sammlung von Dokumenten mit zwei Eigenschaften: Typ & Wert.Erhalten Sie ein Beispiel für jede MongoDB-Aggregatgruppe

[ 
    {type: "A", value: "1"}, 
    {type: "A", value: "2"}, 
    {type: "B", value: "1"}, 
    {type: "B", value: "2"}, 
    {type: "C", value: "1"}, 
    {type: "C", value: "2"} 
] 

Wie kann ich ein zufälliges Dokument von jedem Typ erhalte eine einzelne Abfrage verwendet?

ich versuchte, etwas aus unter Verwendung des Aggregations Rahmen

db.collection.aggregate([ 
    {$group: {_id: "$type", item: {$push: "$$ROOT"}}}, 
    {$sample: {size: 1}} 
]); 

, die nicht die Probennahme auf Figur für jede Gruppe gilt, sondern wählt einfach eine der Gruppen.

Antwort

1

Alternativ können Sie auf alle gruppierten Elemente durchlaufen und die zufällig in einer anderen Art und Weise als $sample verarbeiten:

db.collection.aggregate([ 
    { $group: { _id: "$type", item: { $push: "$$ROOT" } } } 
]).forEach(function(data) { 
    var rand = data.item[Math.floor(Math.random() * data.item.length)]; 
    // insert in a new collection if needed 
    // db.results.insert(rand); 
    printjson(rand); 
}); 

Um ein zufälliges Element aus einem Array auswählen: Getting a random value from a JavaScript array

Diese Lösung kann langsam sein, wie es verwendet keine Aggregation, wenn Sie einen großen eindeutigen Wert von type in Ihrer Sammlung haben

+0

Ich möchte dies in der Abfrage ausschließlich erreichen, nicht durch das Abfrageergebnis der Verarbeitung mit etwas zusätzlichen Code. – Mouz

0

Nicht sicher, ob dies das erreicht, was Sie suchen, aber ich bin es Ich versuche, etwas Ähnliches zu tun, wo ich eine Datengruppe finden muss, die meinen Kriterien entspricht, und dann eine Zufallsstichprobe daraus erhalte.

ich konnte diese nun mit $ passen und $ Probe acheive entlang der Linien des unter:

db.collection('collectionname').aggregate(
{$match : {'type': 'B'}}, 
{$sample: {size: 1}} 
); 
+0

Ich denke, das wird nur eine Probe von B-Typ-Objekten, nicht ein Beispiel für jeden Typ zurückgeben. – Mouz

Verwandte Themen