2013-02-05 125 views
0

我覺得我一定會錯過一些明顯的東西。這裏是聚集,作爲一個將它張貼在shell:爲什麼Mongo聚合不起作用?

db.documents.aggregate(
    { $project: { title: 1, "date.year": 1, decade: 
    { $subtract: ['$date.year', { $mod: ['$date.year', 10]}]} 
}}) 

這是應該採取的文件清單,每一個date.year場,並添加一個十年字段,表示該文件是一個十年在(1900年,1910年等)我計劃進一步轉換數據後,我得到的補充。

的問題是,當我運行聚集,我得到:

{ 
    "errmsg" : "exception: $subtract resulted in a non-numeric type", 
    "code" : 16413, 
    "ok" : 0 
} 

如果我改變$減去至$添加,它工作正常(但不給我正確的結果,當然。 )那麼減法是怎麼回事?爲什麼我在減法時得到一個非數字類型,而在添加時卻是一個數字?

在此先感謝!

+0

工作得很好,當我嘗試過。你的文檔是什麼樣的? – JohnnyHK

+0

嗨,約翰尼。以下是刪節版本: '「title」:「某物或其他」。 「日期」:{ 「年」:1969年, 「月」:12, 「天」:10, 「全」:ISODate( 「1970-01-10T07:00:00Z」) }' 我使用不同的日期字段,因爲並非我正在使用的所有文檔(我存儲在數據庫中的物理文檔)都附有完整日期。 – Terrence

+0

我知道完整日期與日期部分(年,月)不匹配。這是我接下來要解決的問題。 – Terrence

回答

3

這看起來像一個bug in the aggregation framework - 當您正在操作的字段沒有在通過管道的文檔中設置時,它不會正確處理減法。

它已經在2.3.2中修復了(我不能再現這個 - 當未設置「日期」時,它投影爲「null」),但您可以繞過此限制的一種方法是向您的$ match條件添加一個管道,即前綴{$項目}有:

{$match: {"date.year":{$exists:true}}}

+0

謝謝Asya!我認爲你和約翰尼釘住了它。試圖弄清楚,我已經把頭靠在牆上幾個小時。 – Terrence

+0

是的,只是嘗試與$匹配條件設置。這樣做的工作。太棒了!再次感謝! – Terrence