2012-02-10 110 views
94

我剛到Node.js,看到MongoDB有很多libs,最流行的似乎是這兩個:(mongoose和mongodb)。我可以獲得這些擴展的優點和缺點嗎?這兩個有更好的選擇嗎?mongoose vs mongodb(nodejs modules/extensions),哪個更好?爲什麼?

編輯:找到一個新的庫,似乎也有趣的節點蒙古語,是「蒙古DeadBeef是一個超棒的Mongo DB node.js驅動程序,試圖密切近似mongodb shell。」 (readme.md)

https://github.com/marcello3d/node-mongolian

這只是更多的資源添加到瀏覽這個新人,所以基本上蒙古它像一個ODM ...

+0

爲什麼在模式較少的數據庫中使用模式層。如果您希望基於模式的數據庫使用爲其構建的其他內容。 (Mongoose只是MongoDB的模式抽象) – 2016-05-21 13:03:22

回答

109

貓鼬是更高的水平,並使用MongoDB的驅動程序(它是一種依賴,檢查的package.json),所以你可以使用,要麼給出這些選項。您應該問自己的問題是:「我想使用原始驅動程序,還是需要使用對象 - 文檔建模工具?」如果您正在尋找對象建模(ODM,與SQL世界中的ORM對應的工具)以跳過一些較低級別的工作,則需要Mongoose。

如果你想有一個驅動程序,因爲你打算打破了很多的的ODM可能會強制執行,去與MongoDB的規則。如果你想要一個快速的驅動程序,並可以住一些缺少的功能,給蒙古DeadBeef一個嘗試:https://github.com/marcello3d/node-mongolian

33

貓鼬是,到目前爲止,最流行。我使用它,並沒有使用其他人。所以我不能談論其他人,但我可以告訴你我對Mongoose的抱怨。

  • 難/差文檔
  • Models被使用。他們爲您的文檔定義結構。然而,對於Mongo來說,它的優點之一是你可以拋出一個列(err,attribute?)或者簡單的不添加一個。
  • 模型是大小寫敏感的 - 我自己和我有問題工作的其他開發者,其中,該模型與定義的集合名稱的情況下,可能會導致它不保存任何東西,W/O錯誤。我們發現使用全部小寫名稱效果最好。例如。而不是做類似mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })這是更好地做(即使集合名稱是真的MyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

但說實話,這是非常有用的。最大的問題是文檔。它在那裏,但它很乾燥,很難找到你需要的東西。它可以使用更好的解釋和更多的例子。但是,一旦你過去了這些事情,它真的很好。

+10

Re:文檔。我完全同意。文檔不好,而且更糟糕的是,這是不正確的地方。我經常發現自己破解了代碼(這不是一件壞事),但是由於文檔問題。 – 2012-02-10 19:45:48

+1

AFAIK集合名稱在Mongo中區分大小寫,而不是Mongoose。 – 2012-02-10 21:36:16

+0

啊,很高興知道。我使用了兩種服務; MongoHQ&MongoLab - 讓我命名爲'MyCollection'的集合,但在Mongoose中它只會在使用'mycollection'時起作用。 – Marshall 2012-02-10 21:46:25

13

我只使用mongodb。我個人認爲,我會建議先從低水平開始,然後向上移動。否則,您可能會發現自己正在使用像貓鼬這樣的高級驅動程序提供的附加高級功能,而沒有實際的好處。

我曾與MongoDB中,這是特有的node.js的問題是差勁的文檔。有文檔和很多,但它並不總是最有幫助的。我迄今爲止看到的驅動程序的生產使用情況沒有很好和徹底的例子。該文檔填充了打開連接的相同模板化示例,發出命令並關閉連接。您可以告訴它是從模板複製並粘貼的,因爲每個示例都包含可能需要的所有內容,而不僅僅是每個示例所需的內容。

爲了得到完全隨機取一個例子:

  • 原料{布爾值,默認值:假},執行使用原始BSON緩衝器的操作。

到底是什麼「使用原始BSON緩衝區執行操作」嗎?我無法在任何地方找到它,Google搜索該短語也無濟於事。也許我可以進一步谷歌,但我不應該。信息應該在那裏。是否有任何性能,穩定性,完整性,兼容性,便攜性或功能優勢來啓用/禁用此選項?如果不深入研究代碼,我真的不知道,如果你在我的船上,這是一個嚴重的問題。我有一個守護進程,不需要完美的持久性,但程序在運行時需要非常穩定。我可以假設,這意味着它希望我並行化和串行到JSON或者是什麼水平低,內部和對用戶透明的,但我可能是錯的。雖然我傾向於做出很好的假設,但在製作重要系統時,我不能依靠假設和猜測。所以在這裏我可以用代碼來測試我的斷言,或者深入挖掘Google或他們的代碼。作爲一個例子,這不是很糟糕,但是在閱讀他們的文檔時,我多次在這種情況下找到自己。差異可能意味着在一個任務上花費了幾個小時。我需要確認,文件幾乎不給我解釋,更不用說確認了。

該文檔衝去。它沒有解釋事件,提供有關何時拋出錯誤或模糊的細節這些錯誤的性質和經常有幾種方法來完成它可以是不清楚的連接。你可以通過它並不完全無用,但它周圍是非常粗糙的。你會發現有些東西只是猜測和實驗。

+0

隨着偉大的文檔來了不起的軟件。這是最重要的部分之一。 – 2016-08-02 06:49:54

21

我建立新的應用和設計,現在它的結構,下面是關於爲什麼要使用或不使用貓鼬的一些想法:

  1. 貓鼬將是(對大型應用)慢
  2. 貓鼬更難更復雜的查詢
  3. 當你想更快的速度,你會選擇去無貓鼬,那麼你將有貓鼬和半W/O半查詢會有的情況。這是瘋狂的情況下,曾經..
  4. 貓鼬將讓你與簡單的數據庫結構簡單的應用程序
  5. 貓鼬會令你閱讀MongoDB的文檔和貓鼬文檔代碼快
  6. 隨着貓鼬的籌碼將獲得一件事取決於它,而且還有另外一種可能性,即崩潰並燃燒成灰燼。

MongoDB的驅動程序是原始的驅動程序,你直接傳送到MongoDB的。 貓鼬是抽象層。您的db結構非常簡單,您可以更輕鬆地訪問db。

抽象帶來了它的要求,你必須遵循的。你的應用會變慢,吃更多的內存並且變得更加複雜,但是如果你知道如何使用它,你可以更快地寫簡單的對象,將它們保存到數據庫中。

沒有貓鼬你將有直接的連接速度更快的應用程序的MongoDB。沒有人說,你不能寫自己的模型來保存東西到數據庫。您可以。我認爲這很容易。你編寫代碼,你會使用,你知道你需要什麼。你抽象層會變小,然後是貓鼬的。

我來自PHP世界,那裏我們有原始的sql與折舊的mysql_函數,然後我們得到了PDO - 面向對象的抽象層與sql進行通信。或者你可以選擇像Doctrine這樣的重型ORM,在mongoDB上有類似的貓鼬。具有setter/getters/save方法的對象等。這很好,但通過添加更多抽象,您將添加更多文件,更多邏輯,更多文檔和更多依賴關係。我喜歡讓東西簡單並且在我的堆棧中擁有更少的依賴關係。順便說一句,這就是爲什麼我從PHP在第一個地方移到服務器 - 客戶端的Javascript ..

隨着貓鼬,我認爲是偉大的,寫一些簡單的應用程序,具有類似簡單的DB結構爲sql。當你開始有子文件,想要做出所有這些瘋狂的查詢時,我發現它真的很難用貓鼬。您必須查看mongodb文檔,然後查看貓鼬文檔以瞭解如何進行查詢。有時候你會發現,MongoDB的X未來並不是貓鼬,所以你可以選擇原始的MongoDB驅動程序,並在其他地方寫入原始的MongoDB查詢。如果沒有貓鼬,你可以查看mongodb文檔並進行查詢。

+1

我也認爲mongodb比mongoose更好,因爲它快速且可以執行復雜的查詢。對於大型應用程序更好,您應該使用原始mongodb驅動程序。我非常同意你的看法。 – 2018-01-07 05:57:51