我通过map / reduce / finalize实现了皮尔逊产品相关性。缺少的部分是通过过滤器查询来限制要处理的文档(表示用户)。对于像
这样的简单查询mapreduce(mapper, reducer, :finalize => finalizer, :query => { :name => 'Bernd' })
我让这个工作。
但我的过滤条件有点复杂:我有一组首选项需要至少有一个共同元素和另一组首选项,这些首选项可能没有共同的元素。在后面的步骤中,我还想将其限制在特定地理距离内的文档(用户)。
目前我的代码在我的map函数中有效,但我更喜欢将它分成mongoid或javascript函数支持的查询参数。我解决此问题的所有尝试都失败了,因为代码被忽略或引发错误。
我做了几次测试。
[结果已删除,见下文]
我在MacOS上使用ruby 1.9.2,mongodb 1.6.5-x86_64和mongoid 2.0.0.beta.20,mongo 1.1.5和bson 1.1.5 gems。
我做错了什么?
提前致谢。
更多测试(问题部分解决):
User.where(:name.in => ["Arno", "Bernd", "Claudia"])
有效,但是在使用mapreduce时这样
mapreduce(..., :query => { :name.in => ['Arno', 'Bernd', 'Claudia'] })
导致bson错误序列化:键必须是上面提到的字符串或符号(TypeError)。
用:name.in
或'name.in'
替换'name.$in'
会使查询返回无结果(猜测这是按原样传递给mongodb)。
然而
mapreduce(..., :query => { :name => { '$in' => ['Arno', 'Bernd', 'Claudia'] } })
有效,但无论我如何编写表达式,我的地理空间查询尝试都没有取得任何成功。
mapreduce(..., :query => {:location => { "$near" => [ 13, 52, 1 ] } })
导致此error_message:数据库命令'mapreduce'失败:{“assertion”=>“不允许手动匹配器配置”,... 。
如果有人能让我知道如何使用near
或within
编写地理空间查询并使用mapreduce,我会非常高兴。 (我还没玩过套装,见上文)。