MongoDB Group使用Ruby驱动程序

我正在尝试带回一份年/月组合列表,其中包含用于描述博客帖子的计数.这个想法是它们会像这样显示:

> 2010年1月(1个帖子)
> 2009年12月(2个帖子)
> ……

我已经设法使用MongoDB JS shell使其工作,并以有用的格式返回结果:

db.posts.group({ 
    keyf: function(x){ 
                      return { 
                              month: x.datetime.getMonth(), 
                              year:x.datetime.getFullYear() 
                      }; 
    }, 
    reduce: function(x,y){ y.count++ }, 
    initial:{count:0} 
})

结果:

[ { "month" : 0, "year" : 2010, "count" : 3 },
  { "month" : 0, "year" : 1970, "count" : 1 } ]

这很棒,正是我所追求的.但是,尝试将其转换为适合ruby驱动程序的代码,我无法让它工作.我查看了文档,根据我的理解,以下内容应该产生相同的结果(我使用MongoMapper,因此Post.collection):

@archive = Post.collection.group(
  "function(x) { return { month: x.datetime.getMonth(), year:x.datetime.getFullYear() }; }",
  nil, { :count => 0 }, 'function(x,y){y.count++}', true)

而不是回馈有用的数据,我得到了这个烂摊子:

{
  "function(x) { return { month: x.datetime.getMonth(), year:x.datetime.getFullYear() }; }" => nil, 
  "count" => 4.0
}

似乎它完全违背了自己的文档(以及我对源代码的理解!)或者我在这里缺少一些基本的东西.我差点把我的头发拉出来,感激地接受了任何帮助.

最佳答案 这是非常奇怪的行为.我只是在本地运行你的代码,一切正常.你能验证你使用的驱动程序版本是0.18.2吗?如果是这样,请确保这是唯一安装的版本(就像完整性检查一样).

我不认为它应该有任何区别,但我没有从MongoMapper运行#group – 我只使用了gem.你也可以尝试一下.这是我运行的代码:

require 'rubygems'
require 'mongo'

d = Mongo::Connection.new.db('blog')
c = d['post']

p c.group("function(x) { return { month: x.date.getMonth(), year:x.date.getFullYear() }; }", 
  nil, 
  { :count => 0 }, 
  "function(x,y){y.count++}", 
  true)
点赞