4

我正在尝试带回用于描述博客文章的年份/月份组合列表。我们的想法是它们将像这样显示:

  • 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
}

似乎它要么完全违背了它自己的文档(以及我对源代码的理解!),要么我在这里遗漏了一些基本的东西。我几乎把头发拔了,任何帮助都感激地接受。

4

1 回答 1

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)
于 2010-01-24T15:58:44.960 回答