2013-07-28 104 views
1

使用收集的最佳做法是什麼? 由於集合不是強制執行的,爲什麼不把每個對象保存在一個集合中? 有可能通過類似我可以在MongoDB中保存一個集合中的每個對象嗎?

{USS_NewYork:{type:"BattleShip"}} 
{USS_Enterprise:{type:"Carrier"}} 
{dog:{type:"Mammal"}} 

對象,我可以保存一個集船舶和狗,輕鬆地找到合適的對象,所以我爲什麼要divied這些對象不同的收藏?但是,如果我總是將物品保存在一個集合中,爲什麼mongodb暗示集合?

回答

2

因爲MongoDB的集合是異構的,所以在技術上可以將文檔存儲在一個集合中,這些集合之間沒有任何關係。但是爲不同類別的文檔分別存儲集合的優點是,您可以輕鬆地將這些文檔彼此隔離。

在你的例子中,如果你有動物和船隻,你不太可能會有搜索查詢應該返回動物和船舶。大多數查詢可能會從一組動物或一組船舶中返回一個或多個文件。

想象一下,在你的例子中,你想有一個不同類型的Sharks所有動物的列表。所以你做db.collection.find({type:"Shark"}。但不幸的是,你並不知道there is also a type of sailboat named "Shark"。所以雖然你期望得到一些食肉魚,但你之間有幾艘帆船。在返回的文檔中,船隻缺少一些字段,例如habitatpreferred_food,所以這可能會導致應用程序崩潰。

這當然可以通過向每個文檔class:"animal"class:"ship"添加另一個必填字段並確保每個find-query指定類,但實質上是重新創建集合來緩解。

按集合分隔文檔的另一個原因是它可以更容易地應用好的索引。你的應用程序可能會頻繁按類型搜索船隻,但只能通過名稱搜索動物因此,對於所有class = animal對象的名稱以及class = ship的所有對象的type都有一個索引是有意義的。但是除非您將這些文檔放在不同的集合中,否則您將無法做到這一點,因此每個文檔至少會有一個不必要的索引,這些索引需要隨每次寫入操作保持最新。當你的數據庫中有數百萬只動物但只有十幾只船隻時,這變得相當可笑。當所有的動物攜帶一個只適用於船隻的指數時,這將是非常浪費的。

+0

我覺得沒有什麼問題可以通過您的答案將所有內容放入一個集合中。我可以通過查找結果的不明確性來說明一些場景的好處,比如當我需要知道我的藏品中有四條腿的每個生物時。指數可能是一個真正的問題,但在數據量不多的時候並不是必需的。 – ArchenZhang

+0

我覺得把所有東西都放在一個集合中通過你的答案是沒有問題的。我可以通過查找結果的不明確性來說明一些場景的好處,比如當我需要知道我的藏品中有四條腿的每個生物時。指數可能是一個真正的問題,但在數據量不多的時候並不是必需的。 – ArchenZhang

相關問題