使用Rails和Mongoid在Scoped集合上映射/缩小

时间:2011-10-22 12:04:50

标签: ruby-on-rails mongodb mapreduce mongoid

我正在尝试使用带有Mongoid的MongoDB来映射/缩小Rails 3.1应用程序中的范围。

结果看起来很奇怪,所以我想知道map_reduce是否可以应用于预先约束的集合,例如:

current_user.tasks.for_year_and_month(year, month).collection.map_reduce(map, reduce, :out => "res")

for_year_and_month范围内某个月的任务,但map_reduce的结果似乎也包括其他任务。现在我想知道我的map / reduce函数是否错误,或者map / reduce不能应用于预先定义的集合。

如果是这样,我必须在我的发射功能中完成所有示波器的工作,这会使事情变得更糟。我简直不敢相信。

任何人都可以开导我吗?

此致 菲利克斯

3 个答案:

答案 0 :(得分:0)

范围被忽略,因为您直接在集合上工作。

您可以将:query选项传递给map_reduce,这将过滤文档。

例如:

Task.collection.map_reduce(map,reduce,out:{merge:'res'},query:{user_id: x, ...})

答案 1 :(得分:0)

这就是你所追求的:

results = Task.collection.map_reduce(map, reduce, {query: {month: month, year: year}, out: "reduced_task_results"})
filtered_results = results.find({})

答案 2 :(得分:0)

您可以在查询选项中使用Mongoid中的范围选择器:

scoped = current_user.tasks.whatever
Task.map_reduce( ..., :query => scoped.selector)