我正在尝试在Rails 3.1应用程序中使用MongoDB与Mongoid映射/减少范围。
结果看起来很奇怪,所以我想知道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不能应用于预作用域集合。
如果是这样,我必须在emit函数中完成所有作用域的工作,这将使事情变得更糟。我真不敢相信。
有谁能开导我一下吗?
的问候Felix
作用域被忽略,因为您正在直接处理集合。
你可以将:query选项传递给map_reduce,这将过滤文档。
,
Task.collection.map_reduce(map,reduce,out:{merge:'res'},query:{user_id: x, ...})
这就是你想要的:
results = Task.collection.map_reduce(map, reduce, {query: {month: month, year: year}, out: "reduced_task_results"})
filtered_results = results.find({})
您可以在查询选项中使用Mongoid的范围选择器:
scoped = current_user.tasks.whatever
Task.map_reduce( ..., :query => scoped.selector)