【发布时间】:2012-10-15 20:58:38
【问题描述】:
我有一个非常简单的 mongodb map reduce 情况。我在 mysql 世界中需要类似的东西:
select distinct(cookie) from table;
我发现 map reduce 是我在 mongo 中的工具。所以我写了这个:
map2 = Code("function () { emit(this.cookie, 1);}")
reduce2 = Code("function (key, values) {return 1;}")
totalunique = collection.map_reduce(map2, reduce2, out={"reduce":aggregatedcollection}, query=query).count();
到目前为止非常简单。我可以通过 cron 运行它,这可以使 aggregatedcollection 保持最新状态。我保存了一个时间戳变量以放入我的查询中,以确保我只处理每一行一次。
这是我的问题。假设在时间戳t1 我在该集合中有c1 值。不久之后,我在时间戳t2 再次运行它,它返回c2 值。但是在t2 的后续运行中,我希望它返回c2,但我不希望c2 中的新值保存在aggregatedcollection 中。
或者换一种说法,我想在t2第二次运行它,让它返回c2,但是aggregatedcollection只填充c1(来自第一次运行)。
所以在t2 运行后,我希望它返回c2 并在aggregatedcollection 中有c1,这些是这个问题的唯一参数。
看来我应该关注 map reduce 函数的 out option,但这些选项似乎都不是我想要的。
当然,我可以将集合复制到一个临时集合中,对其进行处理,然后将其删除,但这会花费太多时间。
【问题讨论】:
-
为什么不直接打电话给
collection.distinct('cookie')? -
您需要计算多少个不同的值?这些是否适合16MB document limit 的内联结果?
-
对不起,大约有 700 万条记录。 distinct() 函数有效,但它需要很长时间,如果你保持缓存集合是最新的,map_reduce 会非常快。我应该一开始就包含这些信息。
-
如果
distinct()有效,您也应该能够执行inline Map/Reduce .. 但听起来您想在运行c2时将c1用作MapReduce 缓存(无需修改@ 987654347@)? -
是的,
c1代表着大量的工作,并且花费了很多时间来创建(通过 cron 运行数周/数月)。从c1“开始”以达到我的最终目标c2非常重要,因为它可以节省大量时间。