-1

これが私がやっていることです:

mongos> db.campaign_raw_data_459_imp.count()
21800002
mongos> db.campaign_raw_data_459_imp.find({ts:1350585328}).count()
26
mongos>  map = function () { emit(this.cookie, 1);}
function () {
  emit(this.cookie, 1);
}
mongos>  reduce = function (key, values) {return 1;}
function (key, values) {
  return 1;
}
mongos> 
mongos> db.campaign_raw_data_459_imp.mapReduce(map, reduce, {out: { replace : "garbage"}}, query={ts:1350585328})
//This is hanging and taking forever, over 10 minutes now

このコレクションには 2,100 万件のドキュメントがあります。また、特定のタイムスタンプ ( ts=1350585328) には、26 のレコードがあります。ここでの目標は、一致したレコードに含まれる一意の Cookie の数をカウントすることです。したがって、一致するすべてのドキュメント (26 個) が見つかるはずです。そして、それらを Cookie に基づいてバケットにドロップし、バケットを数えます。クエリ FIRST に基づいて検索を実行し、返された値でマップ/リデュースを実行すると思います。その場合、コレクションのサイズはまったく問題になりません。count()2行目であっという間でした。

これは と でインデックス化されてtsおりcookie、3 つのレプリカ セットを持つ 3 つのシャードのセットアップがあります。私のコレクションは 3 つのノードでシャードされており、各シャードは 3 つのメンバーを持つレプリカ セットです。

なぜこんなに時間がかかるのですか?prod の場合、ts を範囲 (おそらく最後の 1 時間) として開くので、一致するドキュメントが 26 個よりもはるかに多くなります。

4

1 に答える 1

1

代わりに、mapReduce呼び出しパラメーターは次のようになります (単一のオブジェクト内のすべてのオプション)。

db.campaign_raw_data_459_imp.mapReduce(map, reduce, 
    {out: { replace : "garbage"}, query: {ts:1350585328}})
于 2012-10-31T02:11:28.003 に答える