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

时间:2012-02-10 18:04:02

标签: javascript node.js mongodb mongoose

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

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

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

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

4 个答案:

答案 0 :(得分:121)

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

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

答案 1 :(得分:33)

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

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

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

答案 2 :(得分:24)

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

  1. Mongoose会慢一些(适用于大型应用)
  2. 对于更复杂的查询,Mongoose更难
  3. 有些情况下,你想要更快的速度,你会选择没有猫鼬,然后你会有一半的问题,猫鼬和一半w / o。那是疯狂的情况,曾经...... [/ li>
  4. 使用简单的数据库结构的简单应用程序,Mongoose将使您的代码更快。
  5. Mongoose会让你阅读mongodb docs和mongoose docs
  6. 使用猫鼬,你的筹码将会有更多东西可以依赖,而且还有一种可能会崩溃并燃烧成灰烬。
  7. mongodb驱动程序是原始驱动程序,您直接与mongodb通信。 猫鼬是抽象层。当db结构足够简单时,您可以更轻松地对数据库进行I / O操作。

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

    没有猫鼬,你可以通过直接连接到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文档并进行查询。

答案 3 :(得分:13)

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

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

举一个完全随机的例子:

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

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

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