如何使用 MongoDB Ruby Driver 进行“分组”(group by)?

nop*_*ole 5 ruby group-by mongodb mongoid

与使用 Ruby 驱动程序的 MongoDB Group相关

如果我想在 SQL 中执行类似以下操作:

select page_id, count(page_id) from a_table group by page_id
Run Code Online (Sandbox Code Playgroud)

我以为 MongoDB 的文档说

http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

group(key, condition, initial, reduce, finalize = nil)
# returns an array
Run Code Online (Sandbox Code Playgroud)

所以从另一篇文章来看,我正在使用:

Analytic.collection.group(  "fucntion (x) return {page_id : x.page_id}", 
                            nil, 
                            {:count => 0},  
                            "function(x, y) { y.count++ }"  )
Run Code Online (Sandbox Code Playgroud)

但它实际上返回

[{"count"=>47.0}] 
Run Code Online (Sandbox Code Playgroud)

这是集合中记录(文档)的总数。上面有什么地方不正确吗?我认为密钥可能是一个静态字符串,如

http://kylebanker.com/blog/2009/11/mongodb-count-group/

db.pageviews.group(
{
 key: {'user.agent': true}, 
 initial: {sum: 0}, 
 reduce: function(doc, prev) { prev.sum += 1}
});
Run Code Online (Sandbox Code Playgroud)

但它不在其他 stackoverflow 帖子中。

更新:实际上,在上面的链接中,解决方案如下

Analytic.collection.group(  ['page_id'], nil, 
  {:count => 0},  "function(x, y) { y.count++ }"  )
Run Code Online (Sandbox Code Playgroud)

有效,但只是想知道为什么本文中的第一种方法不起作用。

nop*_*ole 2

我终于让它工作了

Analytic.collection.group(  ['myapp_id'], {:page => 'products'}, 
  {:pageviews => 0, :timeOnPage => 0},  
  "function(x, y) { y.pageviews += x.pageviews;  y.timeOnPage += x.timeOnPage }"  )
Run Code Online (Sandbox Code Playgroud)

但后来我使用了 Map/Reduce,因为 Map/Reduce 似乎是一种更通用、更强大的方法。