因爲MongoDB的集合是異構的,所以在技術上可以將文檔存儲在一個集合中,這些集合之間沒有任何關係。但是爲不同類別的文檔分別存儲集合的優點是,您可以輕鬆地將這些文檔彼此隔離。
在你的例子中,如果你有動物和船隻,你不太可能會有搜索查詢應該返回動物和船舶。大多數查詢可能會從一組動物或一組船舶中返回一個或多個文件。
想象一下,在你的例子中,你想有一個不同類型的Sharks所有動物的列表。所以你做db.collection.find({type:"Shark"}
。但不幸的是,你並不知道there is also a type of sailboat named "Shark"。所以雖然你期望得到一些食肉魚,但你之間有幾艘帆船。在返回的文檔中,船隻缺少一些字段,例如habitat
和preferred_food
,所以這可能會導致應用程序崩潰。
這當然可以通過向每個文檔class:"animal"
和class:"ship"
添加另一個必填字段並確保每個find-query指定類,但實質上是重新創建集合來緩解。
按集合分隔文檔的另一個原因是它可以更容易地應用好的索引。你的應用程序可能會頻繁按類型搜索船隻,但只能通過名稱搜索動物因此,對於所有class = animal對象的名稱以及class = ship的所有對象的type都有一個索引是有意義的。但是除非您將這些文檔放在不同的集合中,否則您將無法做到這一點,因此每個文檔至少會有一個不必要的索引,這些索引需要隨每次寫入操作保持最新。當你的數據庫中有數百萬只動物但只有十幾只船隻時,這變得相當可笑。當所有的動物攜帶一個只適用於船隻的指數時,這將是非常浪費的。
我覺得沒有什麼問題可以通過您的答案將所有內容放入一個集合中。我可以通過查找結果的不明確性來說明一些場景的好處,比如當我需要知道我的藏品中有四條腿的每個生物時。指數可能是一個真正的問題,但在數據量不多的時候並不是必需的。 – ArchenZhang
我覺得把所有東西都放在一個集合中通過你的答案是沒有問題的。我可以通過查找結果的不明確性來說明一些場景的好處,比如當我需要知道我的藏品中有四條腿的每個生物時。指數可能是一個真正的問題,但在數據量不多的時候並不是必需的。 – ArchenZhang