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

nor*_*784 106 javascript mongoose mongodb node.js

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

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

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

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

cjo*_*ohn 121

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

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


Mar*_*all 33

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

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

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

  • 如果有人想知道文档现在相当不错. (31认同)
  • 回复:文档.我完全同意.文档很糟糕,也更糟糕,它在某些地方是不正确的.我经常发现自己破解了代码(这不是一件坏事),但由于文档问题. (11认同)
  • 我不同意,文档仍然是迟到的. (7认同)
  • 也同意文件仍然缺乏 (5认同)

Luk*_*kas 24

我正在构建新的app并设计它的结构,这里有一些关于为什么使用或不使用mongoose的想法:

  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文档并进行查询.

  • 我也认为mongodb比mongoose更好,因为它很快并且可以进行复杂的查询.对于大型应用程序更好,你应该使用原始的mongodb驱动程序.我非常同意你的看法. (3认同)
  • 即使你没有做一个大型应用程序,我也强烈同意你的观点。与在 mongoose 中执行复杂查询相比,在 mongo 驱动程序中执行复杂查询要容易得多 (2认同)

jgm*_*jgm 13

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

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

举一个完全随机的例子:

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

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

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