【问题标题】:mongodb map reduce without saving new resultsmongodb map reduce而不保存新结果
【发布时间】: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 非常重要,因为它可以节省大量时间。

标签: mongodb mapreduce


【解决方案1】:

试试这个下面这将导致屏幕中的输出..

var options = {out: { "inline": 1 }, query : query};  
db.colls.mapReduce(_mapper, _reducer, options);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多