mongoose vs mongodb(nodejs模块/扩展),哪个更好?为什么?


109

我刚到达Node.js,发现MongoDB有许多库可以使用,最流行的似乎是这两个库:( mongoose和mongodb)。我可以了解这些扩展的优缺点吗?除了这两个以外,还有其他更好的选择吗?

编辑:找到了一个看起来也很有趣的node-mongolian的新库,并且是“ Mongolian DeadBeef是一个很棒的Mongo DB node.js驱动程序,它试图近似于mongodb shell。” (readme.md)

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

这只是为查看此内容的新人增加了更多资源,因此基本上蒙古语就像一个ODM ...


为什么将模式层用于较少模式的数据库。如果要基于模式的数据库,请使用为其构建的其他东西。(猫鼬只是mongodb的模式抽象)
SimonDragsbæk16年

Answers:


123

Mongoose是更高级别的,并使用MongoDB驱动程序(这是一个依赖项,请检查package.json),因此在给定这些选项的情况下,您将使用任一种方式。您应该问自己的问题是:“我要使用原始驱动程序,还是需要对象文档建模工具?” 如果您正在寻找一个对象建模工具(ODM,它是SQL世界中ORM的对应工具),以跳过一些底层工作,则需要Mongoose。

如果您想要一个驱动程序,因为您打算破坏ODM可能执行的许多规则,请使用MongoDB。如果您想要一个快速的驱动程序,并且可以使用某些缺少的功能,请尝试使用Mongolian DeadBeef:https : //github.com/marcello3d/node-mongolian


34

猫鼬是迄今为止最受欢迎的猫鼬。我用它,没有用过别人。所以我不能谈论其他人,但是我可以告诉您我对猫鼬的不满。

  • 困难/记录不良
  • 使用模型。并且它们为您的文档定义结构。但是,对于Mongo来说,这似乎很奇怪,它的优点之一是您可以放入一列(err,attribute?),也可以不添加一列。
  • 模型区分大小写-我和与我合作的其他开发人员都遇到了这样的问题,即定义模型的集合名称的大小写可能导致其不保存任何内容,而没有错误。我们发现使用所有小写字母名称效果最佳。例如,mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })最好不要执行类似的事情(即使集合名称确实是MyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

但老实说,它确实很有用。最大的问题是文档。它在那里,但是很干燥,很难找到您需要的东西。它可以使用更好的解释和更多示例。但是一旦您克服了这些问题,它就会非常好用。


11
回复:文档。我完全同意。文档很糟糕,也使情况更糟,在某些地方是不正确的。我经常发现自己破解了代码(这不是一件坏事),但是由于文档问题。
JP理查森

1
AFAIK集合名称在Mongo中区分大小写,而不是Mongoose。
尼克·坎贝尔

34
如果有人想知道文档现在是否很好。
凯文·比尔

7
我不同意,文档仍然很迟。
史蒂夫·K

5
也将同意仍然缺少文档
布伦丹·温斯坦

25

我正在构建新的应用程序并现在设计它的结构,这是关于为什么使用或不使用猫鼬的一些想法:

  1. 猫鼬会变慢(对于大型应用程序)
  2. 猫鼬难以处理更复杂的查询
  3. 在某些情况下,当您需要更高的速度时,您会选择不使用猫鼬,那么您将有一半的猫鼬查询和一半的w / o。那是一次疯狂的情况。
  4. 猫鼬将使您使用具有简单数据库结构的简单应用程序来更快地编写代码
  5. 猫鼬会让您阅读mongodb文档和mongoose文档
  6. 使用猫鼬,您的堆栈将获得更多依赖,而崩溃和燃烧成灰烬则是另一种可能性。

mongodb驱动程序是原始驱动程序,您可以直接与mongodb通信。猫鼬是抽象层。当您的数据库结构足够简单时,您可以更轻松地对db进行I / O。

抽象带来了它的要求,您必须遵循这些要求。您的应用程序将变慢,占用更多的RAM并变得更加复杂,但是如果您知道如何使用它,则可以更快地编写简单的对象,然后将它们保存到数据库中。

没有mongoose,您将可以直接连接到mongodb,从而拥有更快的应用程序。没有人说过,您无法编写自己的模型来将内容保存到db。您可以。而且我认为这更容易。您编写了将要使用的代码,知道了您所需要的。您的抽象层会更小,然后是猫鼬。

我来自PHP世界,那里的原始sql的mysql_函数已贬值,然后有了PDO-面向对象的抽象层与sql进行通信。或者,您可以选择诸如Doctrine之类的繁重的ORM,使其在mongoDB上具有与mongoose类似的功能。具有setter / getters / save方法的对象,依此类推。很好,但是通过添加更多抽象,您将添加更多文件,更多逻辑,更多文档,更多依赖项。我喜欢使事情保持简单,并减少堆栈中的依赖。顺便说一句,这就是为什么我首先从PHP转到服务器-客户端Javascript的原因。

我认为使用mongoose编写一些简单的应用程序非常好,这些应用程序具有类似于sql的简单db结构。当您开始拥有子文档并想要进行所有这些疯狂的查询时,我发现使用猫鼬真的很难。您必须先查看mongodb文档,然后再查看mongoose文档,以了解如何进行所需的查询。有时,您会发现mongodb的X未来版本不在mongoose中,因此您使用了原始mongodb驱动程序,并在一个或另一个位置编写了原始mongodb查询。没有猫鼬,您可以查看mongodb文档并进行查询。


3
我还认为mongodb比mongoose更好,因为它速度快并且可以执行复杂的查询。对于大型应用程序更好,您应该使用原始的mongodb驱动程序。我非常同意你的看法。
阿卜杜勒·阿林·沙基尔

即使您未开发大型应用程序,我也非常同意。与mongoose相比,在mongo驱动程序中进行复杂查询要容易得多
Juan Juan

14

我只用过mongodb。我个人认为,我建议先从低水平开始,然后再向上发展。否则,您可能会发现自己使用了高级驱动程序(例如猫鼬)提供的其他高级功能,但并没有实际好处。

我在mongodb上遇到的问题是node.js特有的,它是糟糕的文档。有文档和很多文档,但它并不总是最有用。到目前为止,我还没有看到关于驱动程序生产使用的良好且详尽的示例。文档中包含打开连接,发出命令并关闭连接的相同模板示例。您可以说它是从模板复制并粘贴的,因为每个示例都包括了所有可能需要的内容,而不仅仅是每个示例都需要。

举一个完全随机的例子:

  • raw {Boolean,default:false},使用原始bson缓冲区执行操作。

“使用原始bson缓冲区执行操作”到底是做什么的?我在任何地方都找不到它的解释,因此Google搜索该词组无济于事。也许我可以进一步使用Google,但不必这样做。信息应该在那里。启用/禁用此选项是否有性能,稳定性,完整性,兼容性,可移植性或功能上的优势?如果不深入研究代码,我真的不知道,如果您在我的船上,那是一个严重的问题。我有一个守护程序,不需要完美的持久性,但程序在运行时必须非常稳定。我可以假设这意味着它希望我反序列化并序列化为JSON或对用户而言是低级,内部和透明的,但我可能是错的。尽管我倾向于做出良好的假设,但在创建重要系统时我不能依靠假设和猜测。因此,在这里我可以使用代码测试我的断言,或者更深入地研究Google或其代码。作为一个人,这还不错,但是在阅读他们的文档时,我经常遇到这种情况。差异可以表示花在任务上的天数与小时数。我需要确认,而文档几乎没有给我解释,更不用说确认了。

该文档急。它没有解释事件,没有提供有关何时引发错误或这些错误的性质的模糊细节,并且通常有几种方法可以实现不清楚的连接。您可以得到它,它并不是完全没有用的,但是它的边​​缘非常粗糙。您会发现有些事情需要猜测和试验。


出色的文档随附出色的软件。这是最重要的部分之一。
卢卡斯·里西斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.