map-reduceソリューションを選択する代わりに、結果を簡単に集計できます。
-
Match
日付が指定された日付よりも大きいレコード。 -
Group
brand_id
に基づく フィールド。 -
$addToSet を使用します
products
を維持するための演算子 一意のproduct_id
のリスト グループごとに。 -
Project
count
products
の 各キーの配列。
コード:
db.collection.aggregate([
{$match:{"date":{$gte:new Date('2014-11-20')}}},
{$group:{"_id":"$brand_id","products":{$addToSet:"$product_id"}}},
{$project:{"_id":0,"brand_id":"$_id","distinct_prod":{$size:"$products"}}}
])
map-reduceソリューションに来てください
これは、mongodbが各グループのreduce関数を呼び出す1つの方法です。 docs から :
map
にいくつかの変更を加える必要があります 、reduce
関数を追加し、新しいfinalize
を追加します 機能:
-
mongodb
の場合は、そのことを覚えておく必要がありますreduce
を呼び出します 同じキーの関数が複数回使用される場合、前回の呼び出しの結果は、次にreduce関数が呼び出されたときに、他の値とともに、reduce関数への入力として渡されます。 - 最初のポイントです。したがって、reduce関数への入力とreduce関数からの戻り値が同様に構築されていることを確認する必要があります。これにより、reduce関数内に記述されたロジックが、以前の呼び出しでの独自の戻り値の処理に対応できるようになります。
- バッチで呼び出された場合、個別の値の数を取得することはできないため、
reduce
を記述して実行できます。 個別のproduct_ids
を蓄積する関数 キーごとにfinalize
を記述します それらの一意の値の数を計算する関数。
コード:
db.collection.mapReduce(
function() {
// emitting the same structure returned by the reduce function.
emit(this.brand_id, {"prod_id":[this.product_id]});
},
function(key, values) {
// the return value would be a list of unique product_ids.
var res = {"prod_id":[]};
for(var i=0;i<values.length;i++)
{
for(var j=0;j<values[i].prod_id.length;j++){
if(res.prod_id.indexOf(values[i].prod_id[j]) == -1){
res.prod_id.push(values[i].prod_id[j]);
}
}}
return res;
},
{
query: {date: {$gte: new Date('2014-11-20')}},
out: "example",
finalize: function(key, reducedValue){
// it returns just the count
return reducedValue.prod_id.length;
}
}
)