在Mongoid中链接map_reduce调用的正确方法是什么?
问题描述:
我有一个属于用户的元素模型。我试图计算下面的哈希值:有多少用户的元素数为1,2,3等。我采用的方法是首先生成{user - > num元素}的哈希,然后我对它进行排序使用第二个map-reduce。在Mongoid中链接map_reduce调用的正确方法是什么?
这是我到目前为止有:
Element.map_reduce(%Q{
emit(this.user_id, 1);
}, %Q{
function(key, values) {
return Array.sum(values);
}
}).out(inline: true).map_reduce(%Q{
if (this.value > 1) {
emit(this.value, this._id);
}
}, %Q{
function(element_count, user_ids) {
return user_ids.length;
}
}).out(inline: true)
这给了我一个“未定义的方法`map_reduce”错误。我无法在文档中找到答案。任何帮助都会很棒。
答
我使用骨料代替映射精简,第一分组由用户,然后由元件再次分组计数计算的散列:
Element.collection.aggregate([
{
"$group" => {
"_id" => "$user_id", "elements_count" => {"$sum" => 1}
}
},
{
"$group" => {
"_id" => "$elements_count", "users_count" => {"$sum" => 1}
}
},
{ "$project" => {
"_id" => 0,
"users_count" => '$users',
"elements_count" => '$_id',
}
}
])
这将返回以下的数组:
[
{"users_count"=>3, "elements_count"=>2},
{"users_count"=>4, "elements_count"=>3},
...
]
如果需要它可以也可使用$sort运营商排序
+0
不幸的是,并不是所有的操作符都可以用于项目,所以一般不起作用 – Xodarap 2014-12-30 19:09:45
您使用的是什么版本的Mongoid? – 2013-03-18 14:45:59
我正在使用3.0.23 – Yevgeniy 2013-03-19 05:15:12