javascript - mongoose vs mongodb(nodejs modules / extensions),哪个更好? 为什么?

我刚刚到达Node.js,看到有很多用于MongoDB的库,最受欢迎的似乎是这两个:( mongoose和mongodb)。 我可以获得这些扩展的优缺点吗? 这两个有更好的替代品吗?

编辑:找到一个看起来也很有趣的节点-mongolian的新库,并且是#34; Mongolian DeadBeef是一个非常棒的Mongo DB node.js驱动程序,试图接近mongodb shell。"(readme.md)

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

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

norman784 asked 2019-07-11T06:19:16Z
4个解决方案
121 votes

Mongoose是更高级别并使用MongoDB驱动程序(它是一个依赖项,检查package.json),所以你将使用这种方式给出这些选项。 您应该问自己的问题是,"我是否想要使用原始驱动程序,还是需要对象文档建模工具?" 如果您正在寻找对象建模(ODM,与SQL世界的ORM对应)工具以跳过一些较低级别的工作,那么您需要Mongoose。

如果你想要一个驱动程序,因为你打算打破ODM可能强制实施的许多规则,那就选择MongoDB吧。 如果你想要一个快速的驱动程序,并且可以使用一些缺少的功能,请试试Mongolian DeadBeef:[https://github.com/marcello3d/node-mongolian]

cjohn answered 2019-07-11T06:19:39Z
33 votes

到目前为止,猫鼬是最受欢迎的。 我使用它,并没有使用其他人。 所以我不能谈论其他人,但我可以告诉你我对猫鼬的抱怨。

  • 困难/差的文件
  • 使用模型。 他们定义了文档的结构。 然而,对于Mongo而言,这似乎很奇怪,其中一个优点是你可以抛出一个列(错误,属性?)或者根本不添加一个。
  • 模型区分大小写 - 我自己和我合作的其他开发人员都遇到过这样的问题:模型定义的集合名称的情况可能导致它不保存任何内容,没有错误。 我们发现使用所有小写名称效果最佳。 例如。 不要做像mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })这样的事情,这样做更好(即使集合名称真的是MyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

但说实话,这非常有用。 最大的问题是文档。 它在那里,但很难找到你需要的东西。 它可以使用更好的解释和更多的例子。 但是一旦你超越了这些东西它就会非常好用。

Marshall answered 2019-07-11T06:20:43Z
24 votes

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

  1. 猫鼬会慢一些(适用于大型应用)
  2. 对于更复杂的查询,Mongoose更难
  3. 有些情况下,你想要更快的速度,你会选择没有猫鼬,然后你会有一半的问题,猫鼬和一半w / o。 那个疯狂的情况,曾经......
  4. 使用简单的数据库结构的简单应用程序,Mongoose将使您的代码更快
  5. Mongoose会让你阅读mongodb docs和mongoose docs
  6. 随着猫鼬,你的堆栈将获得一个更依赖的东西,并且它更有可能崩溃并燃烧成灰烬。

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

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

没有猫鼬,你可以通过直接连接到mongodb获得更快的应用程序。 没有人说,你不能编写自己的模型来保存数据库。 您可以。 而且我认为这更容易。 您编写代码,您将使用它,您知道您需要什么。 你的抽象层会更小,然后是猫鼬。

我来自PHP世界,我们有原始sql和折旧的mysql_函数,然后我们得到PDO - 面向对象的抽象层与sql通信。 或者你可以选择一些像Doctrine这样的重型ORM,在mongoDB上有类似mongoose的东西。 具有setter / getters / save方法等的对象。 这很好,但通过添加更多抽象,您可以添加更多文件,更多逻辑,更多文档,更多依赖项。 我喜欢保持简单的东西,并且在我的堆栈中具有较少的依赖性。 顺便说一句,这就是为什么我首先从PHP迁移到服务器客户端Javascript的原因..

使用mongoose我认为编写一些简单的应用程序非常棒,它们具有类似于sql的简单数据库结构。 当你开始使用子文档并想要进行所有那些疯狂的查询时,我发现它很难用mongoose。 您必须查看mongodb文档,然后查看mongoose文档以了解如何进行所需的查询。 有时候你会发现,mongodb的X未来不是mongoose,所以你可以选择原始mongodb驱动程序并在一个或另一个地方编写原始的mongodb查询。 没有猫鼬,你看看mongodb文档并进行查询。

Lukas answered 2019-07-11T06:22:37Z
13 votes

我只用了mongodb。 在我个人看来,我会建议从低级别开始,然后向上移动。 否则,您可能会发现自己使用更高级别驱动程序(如mongoose)提供的其他高级功能,而无法获得实际好处。

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

举一个完全随机的例子:

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

究竟是什么"使用原始bson缓冲区执行操作"做?我无法在任何地方找到它,Google搜索该短语并没有帮助。也许我可以进一步谷歌,但我不应该这样做。信息应该在那里。启用/禁用此选项是否具有任何性能,稳定性,完整性,兼容性,可移植性或功能优势?如果不深入研究代码我真的不知道如果你在我的船上这是一个严重的问题。我有一个守护进程,其中不需要完美的持久性,但程序需要在运行时非常稳定。我可以假设这意味着它希望我反序列化和序列化为JSON,或者是低级别,内部和透明的用户,但我可能是错的。虽然我倾向于做出很好的假设,但在制作重要系统时,我不能依赖于假设和猜测。所以在这里,我可以用代码测试我的断言,或者深入研究Google或他们的代码。作为一个关闭,这不是很糟糕,但我在阅读他们的文档时多次发现自己处于这种情况。差异可能意味着在任务上花费的天数与小时数相比。我需要确认,文档几乎没有给我解释,更不用说确认了。

文件匆忙。 它没有解释事件,给出了关于何时抛出错误或这些错误的性质的模糊细节,并且通常有几种方法可以实现连接,这可能是不清楚的。 你可以过去并且它不是完全无用的,但它的边缘非常粗糙。 你会发现有些事情需要猜测和实验。

jgmjgm answered 2019-07-11T06:23:47Z
translate from https://stackoverflow.com:/questions/9232562/mongoose-vs-mongodb-nodejs-modules-extensions-which-better-and-why