2011-11-01 83 views
2

假設我們有用戶和後期收集。在收集後,投票將用戶名存儲爲密鑰。Mongodb地圖減少2個集合

db.user.insert({name:'a', age:12}); 
db.user.insert({name:'b', age:12}); 
db.user.insert({name:'c', age:22}); 
db.user.insert({name:'d', age:22}); 

db.post.insert({Title:'Title1', vote:[a]}); 
db.post.insert({Title:'Title2', vote:[a,b]}); 
db.post.insert({Title:'Title3', vote:[a,b,c]}); 
db.post.insert({Title:'Title4', vote:[a,b,c,d]}); 

我們希望通過post.Title進行分組,並找出不同用戶年齡的投票數。

> {_id:'Title1', value:{ ages:[{age:12, Count:1},{age:22, Count:0}]} } 
> {_id:'Title2', value:{ ages:[{age:12, Count:2},{age:22, Count:0}]} } 
> {_id:'Title3', value:{ ages:[{age:12, Count:2},{age:22, Count:1}]} } 
> {_id:'Title4', value:{ ages:[{age:12, Count:2},{age:22, Count:2}]} } 

我已經通過搜索,並沒有找到一種方法訪問2 MongoDB mapreduce中的集合。 難道有可能實現再減少?

我知道在後期嵌入用戶文檔非常簡單,但它不是一個很好的方式,因爲真正的用戶文檔有很多屬性。如果我們包含用戶文檔的簡化版本,則會限制分析的維度。

{Title:'Title1', vote:[{name:'a', age:12}]} 
+0

無法對多個集合執行map-reduce。當你說嵌入文檔方面「這不是一個好的方法」時,還請說明你的理由。儘可能提供您的設計考慮。 –

回答

1

MongoDB沒有多集合Map/Reduce。 MongoDB沒有任何JOIN語法,可能不適合ad-hoc連接。您需要以某種方式對數據進行非規範化。

您有幾種選擇:

選項#1:嵌入年齡跟投。

{Title:'Title1', vote:[{name:'a', age:12}]} 

選項#2:保持年齡的計數器

{Title:'Title1', vote:[a, b], age: { "12" : 1, "22" : 1 }} 

選項#3:做一個 「手動」 加入

你最後的選擇就是寫劇本/代碼,它會對這兩個集合執行for循環並正確合併數據。

因此,您將循環播放post並輸出帶有標題和選項列表的集合。然後,您將通過查看每個user來瀏覽新的收藏集並更新年齡。

我的建議

圍棋與1號或2。

0

而不是

{name:'a', age:12} 

更容易到一個新的字段添加到用戶的文檔,並保持它在每個投票update.Of當然,你可以盡情地使用地圖縮小分析你的數據。

{name:'a', age:12, voteTitle:["Title1","Title2","Title3","Title4"]}