2012-10-28 13 views
28

我是一個超級新手mongodb。我正在使用貓鼬從node.js訪問mongodb,並知道如何讓事情發揮作用,但我不認爲我理解它爲什麼會按照它的方式工作。爲什麼當mongodb的好處被認爲是無模式時,貓鼬使用模式?

最重要的是,我不明白爲什麼貓鼬有'架構',當mongodb的突出特點之一是它沒有模式。有人能啓發我嗎?謝謝。

+1

我認爲這是一個默認模式的情況,但是您可以在應用程序代碼中動態添加字段,而無需將表作爲一個整體進行更改。一個例子是一個龐大的產品表,在SQL中添加一個很糟糕且緩慢的字段,在MongoDB中只是將它添加到客戶端模型中... – Sammaye

+0

MongoDB不是無模式的。它有靈活的模式 - 有很大的不同。 –

+0

這是一個味道的問題,如果你使用的驅動程序你沒有得到,並且將不得不推出自己的驅動程序,Mongoose可以讓你有一個帶有驗證的類型化模式。另一方面,Mongoose層會對原始性能產生一定的影響,因爲它會對原始驅動程序花費更多的時間進行管理。 – christkv

回答

22

沒有模式的數據是無用的。你從MongoDB獲得一個文檔,你對它做了什麼?閱讀一些領域?您需要知道這些字段的名稱,類型和含義。這是一個模式。

當人們說MongoDB「沒有模式」時,他們確實意味着它不像SQL數據庫那樣強制實施模式。 MongoDB將架構問題推到了您的應用程序級別,您可以更靈活地處理它們。例如,爲了向您的文檔添加新字段,您無需爲您的收藏集執行全部或全部無效的ALTER-可能有數百萬條記錄。您只需將該字段添加到您的ODM(Mongoose)模式,即可完成。

+4

不完全正確。有實時的應用程序可以依靠動態創建的字段。向Mongoose模型添加一個字段意味着一個新的部署過程。有些ODM不需要固定的模式定義,例如Mongorito。 –

+0

有沒有聽說過自定義字段?假設你希望你的客戶能夠定義他們自己的模式,你希望存儲在自己的集合中,而不必讓開發人員爲每個客戶更改代碼。這是無模式設計的完美用例。 –

+0

@TimHardy你說「定義自己的模式」,但後來稱之爲「無模式」 - 看到那裏有矛盾嗎?我沒有說「沒有靜態模式的數據是無用的」。 –