2016-10-30 10 views
1

私はMongoDBの2つのプロパティーを持つ文書のコレクションを持っています:タイプ&値。各MongoDB集約グループのサンプルを取得

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

はどのようにして単一のクエリを使用して、各タイプの1つのランダム文書を得ることができますか?

は、私は、各グループのサンプリングを適用するが、単にグループのいずれかを選択しない集約フレームワーク

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

を使って何かを把握しようとしました。

答えて

1

代わりに、すべてのグループ化された要素で反復し、$sampleよりも別の方法でランダムに処理することができる:

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); 
}); 

配列からランダムな要素を選択する:Getting a random value from a JavaScript array

この溶液をとして遅くなることがあなたのコレクションに大きな別の値typeがある場合、アグリゲーションは使用されません。

+0

私は排他的にクエリで、ないとの問い合わせ結果を処理することによって、これを達成したいと思いますいくつかの余分なコード。 – Mouz

0

これはあなたが探しているものを達成するかどうかはわかりませんが、私は私の基準に合致するデータのグループを見つけてそこから無作為なサンプルを取得する必要がある、何か類似したことをしようとしています。

私は今、以下の線に沿って、$マッチと$サンプルを使用して、これをacheiveすることができました:

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

これはB型オブジェクトのサンプルを返すだけで、各タイプのサンプルは返さないと思います。 – Mouz

関連する問題