-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

此集合中有 2100 万份文档。而且,对于给定的时间戳 ( ts=1350585328),有 26 条记录。这里的目标是计算匹配记录中有多少唯一 cookie。所以它应该找到所有匹配的文档,其中 26 个。然后根据cookie将它们放入桶中,然后对桶进行计数。我假设它会根据查询首先进行查找,然后对这些返回值进行映射/归约。如果是这种情况,那么集合的大小根本不重要。count()眨眼间,它就在第二行中完成了。

ts我在and上有这个索引cookie,并且我有一个带有三个副本集的三个分片设置。我的集合在三个节点上分片,每个分片是一个具有 3 个成员的副本集。

为什么这需要这么长时间?对于 prod,我将把 ts 开放为一个范围(也许是最后一个小时),所以它会有比 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 回答