2013-04-04 91 views
3

我試圖模擬客戶喜歡食物的多對多關係。Mongo多對多

我期待得到這些關係的地段(百萬),所以我不想讓他們都在同一個最終加入表無法擴展。

我創建了兩個文檔集合,

Customers 
- name etc 
- countOfLoves 
- loves [ ... ] 

Foods 
- name etc 
- countOfLoves 
- loves [ ... ] 

每個文檔裏面是「愛」代表的關係和計數,迅速得到總計子文檔集合。

我曾以爲,這將擴展,因爲不是一個查詢表上擁有數百萬行的我可以得到一個單一的文件以及和它的子陣。但是,當顧客開始喜歡大量食物時(而相反,當食物被很多顧客喜愛時),我遇到了一個問題

以下是更新客戶文檔時查詢新食品被愛。在這種情況下,客戶已經喜歡其他食品7000:

query: { _id: "354286" } 
update: { $push: { loves: { foodID: "354286", location: [ 55.752197, 37.6156 ] } }, $inc: { countOfLoves: 1 } } 
nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:10135199 10137ms 

這裏有兩個問題真的,

一)這是爲什麼用10秒鐘 - 有一些關於$推,我不知道

二)是否有蒙戈一個更好的架構,可這種關係的模型?

(和我猜(C) - 我是在優化 - 我應該只是做一個愛連接表,這將是罰款)​​

回答

1

一個我看到它,如果是緩慢的原因文件的大小很大,不適合它的位置,它將被移到另一個地方。這可能是10秒的原因。你可以在這裏看到類似的討論:https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/FnL0mDWs5w0。解決方案之一是在創建時使用虛擬值提交數組,並使用一些如何更新它們而不添加新的愛。在這種情況下,可能是你必須選擇一個更集合作爲愛,其中對於每個愛你的存儲客戶ID和他所愛

+0

創造一個第三收集另一種方法是,讓每個食品和客戶的多個記錄。在這種情況下,您可以對每個集合(例如10個)的愛數進行限制,然後填充該數字,然後在所有插槽已滿時移動到新記錄。您需要在每個文檔中包含「完整」標誌,這些標誌將作爲查找索引的一部分,以便快速插入。 – 2013-04-04 13:13:25

+0

嗯這看起來不錯的選擇,但什麼是可能的方式填充它很好的方式任何想法? – Devesh 2013-04-04 14:28:43

+1

參見下頁,其中手動填充提供指導:http://docs.mongodb.org/manual/faq/developers/#can-i-manually-pad-documents-to-prevent-moves-during-updates – 2013-04-04 14:33:11