2013-05-17 49 views
2

我有一份文檔,其結構如下,我想在過去的2個月中添加2013.5和2013.4的總數,作爲獲取過程的一部分前10名包裝。

如果我使用的骨料

db.hits.aggregate(
    {$project:{"total":{"$add":["$value.2013.5", "$value.2013.4"]}}}) 

這將在總回報數值只有在文檔中存在兩個領域。如果缺少任何字段,則總數值爲null。任何想法如何我可以瀏覽這個。 $ project後面有$ group,$ sort,$ limit,但爲了清晰起見我省略了它們。

{ 
    "_id" : "4e6eef33-d88a-4d4d-a6b2-6becf1be7e8f", 
    "value" : { 
    "package" : 4498 
    "2012" : { 
     "1" : 1.0, 
     "2" : 1.0, 
     "4" : 1.0, 
     "6" : 4.0, 
     "7" : 2.0, 
     "8" : 5.0, 
     "12" : 1.0, 
     "hits" : 15.0 
    }, 
    "2013" : { 
     "1" : 6.0, 
     "4" : 2.0, 
     "hits" : 8.0 
    }, 
    "hits" : 23.0 
    } 
} 

順便說一句,我只用了兩個月來說明。我通常會使用12個月。

編輯: 我的回退是編寫一個函數,在文檔中添加缺少的字段。如果我有辦法避免這樣做,我很感興趣。

回答

4

只有在兩個字段都存在於文檔中時,這將返回一個總數值。

如果其中一個字段不存在,則將其視爲undefinedundefined值在任何操作中傳播。

如果我使用聚合[...]

您可以使用$ifNull操作:

db.hits.aggregate({$project:{"total":{"$add":[{$ifNull: ["$value.2013.5", 0]}, {$ifNull: ["$value.2013.4", 0]}]}}}) 
相關問題