2010-01-24 121 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代碼的支持,並且確實修復了它。我覺得適當愚蠢:) –

相關問題