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

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

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

select page_id, count(page_id) from a_table group by page_id 

我认为MongoDB的文档说

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

 group(key, condition, initial, reduce, finalize = nil) # returns an array 

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

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

但它实际上会回来

 [{"count"=>47.0}] 

这是集合中记录(文档)的总数。 以上是不正确的? 我以为密钥可能是一个静态字符串

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} }); 

但它不在另一个stackoverflowpost中。

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

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

工作,但只是想知道为什么这篇文章中的第一个方法不起作用。

第一个例子不起作用的原因是你拼错了“function”作为“fucntion”。 以下应该有效:

 Analytic.collection.group( "function(x){ return {page_id : x.page_id}; }", nil, { :count => 0 }, "function(x, y){ y.count++; }" ) 

我终于得到了它的工作

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

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