2013-03-13 118 views
3

我有一個屬於用戶的元素模型。我試圖計算下面的哈希值:有多少用戶的元素數爲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」錯誤。我無法在文檔中找到答案。任何幫助都會很棒。

+0

您使用的是什麼版本的Mongoid? – 2013-03-18 14:45:59

+0

我正在使用3.0.23 – Yevgeniy 2013-03-19 05:15:12

回答

2

我使用骨料代替映射精簡,第一分組由用戶,然後由元件再次分組計數計算的散列:

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

相關問題