这就是我正在做的事情:
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
此系列中有2100万份文件。并且,对于给定的时间戳(ts
= 1350585328),有26条记录。这里的目标是计算匹配记录中有多少个唯一的cookie。所以它应该找到所有匹配文件,其中26个。然后根据cookie将它们放入桶中,然后计算桶数。我会假设它将根据查询FIRST执行查找,然后使用这些返回值执行map / reduce。如果是这种情况,那么集合的大小根本不重要。它眨眼间就在第二行做了count()
。
我已将此编入索引ts
和cookie
,并且我有三个碎片设置,其中包含三个副本集。我的集合在三个节点上分片,每个分片是一个包含3个成员的副本集。
为什么这花了这么长时间?对于prod,我打算将ts打开为一个范围(也许是最后一个小时),因此它将拥有许多匹配文档,而不仅仅是26个。
答案 0 :(得分:1)
mapReduce
调用参数应该是这样的(单个对象中的所有选项):
db.campaign_raw_data_459_imp.mapReduce(map, reduce,
{out: { replace : "garbage"}, query: {ts:1350585328}})