3

我有一个属于用户的元素模型。我正在尝试计算以下哈希:有多少用户的元素计数为 1、2、3 等。我采用的方法是首先生成 {user -> num elements} 的哈希,然后将其反转使用第二个 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'”错误。我在文档中找不到答案。任何帮助都会很棒。

4

1 回答 1

2

我使用聚合而不是 mapreduce 计算哈希,首先按用户分组,然后再按元素计数分组:

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运算符对其进行排序

于 2014-11-24T20:47:46.173 回答