これが私がやっていることです:
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 個よりもはるかに多くなります。