MongoDB Group с использованием драйвера Ruby - PullRequest
4 голосов
/ 24 января 2010

Я пытаюсь вернуть список комбинаций год / месяц с подсчетами для описания сообщений в блоге. Идея в том, что они будут отображаться так:

  • январь 2010 (1 сообщение)
  • декабрь 2009 (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)

Вместо того, чтобы отдавать хороший массив полезных данных, я получаю этот беспорядок:

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

Кажется, либо он полностью игнорирует свою собственную документацию (и мое понимание исходного кода!), Либо я упускаю что-то фундаментальное. Я почти выдергиваю волосы, любая помощь с благодарностью принята.

1 Ответ

2 голосов
/ 24 января 2010

Это довольно странное поведение. Я просто запустил ваш код локально, и все заработало. Можете ли вы проверить, что вы используете версию драйвера 0.18.2? Если это так, убедитесь, что это единственная установленная версия (просто как проверка работоспособности).

Я не думаю, что это должно иметь какое-либо значение, но я не запускал #group из MongoMapper - я использовал только гем. Вы можете попробовать это тоже. Вот код, который я запустил:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...