2010-01-24 89 views
4

我试图带回一个包含用于描述博客帖子的计数的年/月组合列表。这个想法是,它们将显示如下所示:MongoDB Group使用Ruby驱动程序

  • 2010年1月(1篇文章)
  • 2009年12月(2个)
  • ...

我设法得到这个使用MongoDB的JS壳工作,并返回一个有用的格式结果:

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) 

用之于有用的数据的好的阵列,我m如果这个烂摊子:(!和我的源代码的理解)

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

看来,要么是完全无视自己的文档或我在这里失去了一些东西根本。我几乎把我的头发拉出来,任何帮助感激地接受。

回答

2

这是非常奇怪的行为。我只是在本地运行你的代码,并且一切正常。你能证实你使用的驱动版本是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) 
+0

我检查了版本,我安装了0.18和0.18.2。我已经删除了旧版本和更新的MongoMapper(我依赖于0.18版本)。问题依然存在。我也曾尝试过只使用驱动程序,在我的情况下它仍然失败。我不明白为什么它对你的行为会比对我的行为不同? 编辑:尝试在自己的脚本中,因为你有正确的结果。它似乎只在我的Rails应用程序中失败。 –

+0

嗯。不知道Rails可能会对此产生什么影响。我认为最好的办法是为我和John(MongoMapper)创建一个完整的失败测试用例。 –

+0

哦,我一直是一个巨大的枕头。原来是0.18到0.18.2之间的版本差异。我忘了重新启动dev服务器后,我删除了旧的宝石,并更新了一切。回过头来看看github上的0.18源代码,我发现在0.18.2之间增加了对keyf代码的支持,并且确实修复了它。我觉得适当愚蠢:) –

相关问题