2015-06-10 40 views
0

我已經持有彙總數據和每一天的日期由鍵(Y2015-M04-D18)創建一個文件形成的日期:通過文檔鍵MongoDB的彙總數據

數據

{ 
    'Y2015': { 
     'M04': { 
      'D18': 100, 
      'D19': 200 
     } 
    }, 
    'order_id': 'VjprK', 
    'user_id': '777' 
} 

{ 
    'Y2015': { 
     'M04': { 
      'D18': 100, 
      'D19': 20 
     } 
    }, 
    'order_id': 'LaOPX', 
    'user_id': '777' 
} 

{ 
    'Y2015': { 
     'M04': { 
      'D18': 100, 
      'D19': 50 
     } 
    }, 
    'order_id': 'cYwxf', 
    'user_id': '777' 
} 

如何我可以查詢它返回300的總和爲user_id = 777,日期爲2015-04-18

回答

0

沒什麼好不:

db.junk.aggregate([ 
    { "$match": { "user_id": "777" } }, 
    { "$group": { 
     "_id": "$user_id", 
     "total": { "$sum": "$Y2015.M04.D18" } 
    }} 
]) 

像你認爲這並非是「兩個關鍵」聚集。但實際上,因爲您的數據是按照這種方式按日期構建的,所以它只是將路徑映射到值的一個問題,這將始終保持一致。只需刪除多個「用戶」的$match即可。

這個結構的問題雖然會聚合「多個日期」,你可能應該修改這個,如果這將是你的意圖在某個時刻。

+0

看起來不錯,現在就進行測試。但是如果我想使用日期範圍?說2015-04-18 - 2015-04-19? – Broshi

+0

@Broshi正如我在最後一段所說的那樣,這不是一個好的結構。你可以用mapReduce做到這一點,但如果你需要這樣做,那麼在聚合框架是一個更好的處理器的情況下,它可能會更好**,以便在陣列中「faltten」或至少放置「days」。但是聚合框架不能像這樣遍歷嵌套對象,這就是爲什麼你可能應該改變它。 –

+0

因此,爲了在我的收藏夾中保存彙總數據,您會推薦這種結構http://pastebin.com/hDvrCSMg作爲我所展示的更好的解決方案嗎? – Broshi