【问题标题】:How to use MongoDB Ruby Driver to do a "Group" (group by)?如何使用 MongoDB Ruby Driver 进行“分组”(group by)?
【发布时间】:2010-09-16 03:41:57
【问题描述】:

MongoDB Group using Ruby driver相关

如果我想在 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}
});

但它不在另一个stackoverflow帖子中。

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

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

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

【问题讨论】:

    标签: ruby mongodb group-by mongoid


    【解决方案1】:

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

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

    【讨论】:

    • 如果我更正拼写,该行将返回 [{"page_id"=>nil, "count"=>47.0}] 仍然...
    • 您应该确保您的数据实际上除了 nil 之外还有 page_id 的值。该结果似乎表明所有 47 个文档的 page_id 均为 nil。我使用的是 1.6.0 版的 mongodb 和 gem 1.0.7,无法确定之前的版本是否会产生不同的结果。
    【解决方案2】:

    终于搞定了

    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 似乎是一种更通用、更强大的方法。

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 2020-08-19
      • 1970-01-01
      • 2014-10-22
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多