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

Javascript mongoose与mongodb(nodejs模块/扩展),哪个更好?为什么?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我刚到Node.js,看到MongoDB有很多lib可以使用,最流行的似乎是这两个:(mongoose和MongoDB)。我能得到这些扩展的优点和缺点吗?除了这两个,还有更好的选择吗 编辑:发现了一个新的库,它看起来也很有趣,是“Mongon DeadBeef是一个很棒的Mongo DB node.js驱动程序,它试图接近mongodb shell。”(readme.md) 这只是为了增加更多的资源给那些有这种观点的人,所以基本上蒙古语就像是ODM…到目前为止,猫鼬是最受欢迎的。我用过,没有用

我刚到Node.js,看到MongoDB有很多lib可以使用,最流行的似乎是这两个:(mongoose和MongoDB)。我能得到这些扩展的优点和缺点吗?除了这两个,还有更好的选择吗

编辑:发现了一个新的库,它看起来也很有趣,是“Mongon DeadBeef是一个很棒的Mongo DB node.js驱动程序,它试图接近mongodb shell。”(readme.md)


这只是为了增加更多的资源给那些有这种观点的人,所以基本上蒙古语就像是ODM…

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

  • 记录困难/不良
  • 都用过了。它们定义了文档的结构。然而,这对于Mongo来说似乎有些奇怪,它的优点之一是可以插入一列(呃,属性?),或者干脆不添加一列
  • 模型是区分大小写的-我自己和其他与我一起工作的开发人员遇到过这样的问题:定义模型时使用的集合名称的大小写可能会导致它不保存任何内容,而不存在错误。我们发现使用所有小写名称效果最好。例如,与其做类似于
    mongooseinnstace.model('MyCollection',{“\u id”:Number,“xyz”:String})
    的事情,不如做(即使集合名称实际上是
    MyCollection
    ):
    mongooseinnstace.model('MyCollection',{“\u id”:Number,“xyz”:String})

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

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


如果您想要一个驱动程序,因为您想要打破ODM可能强制执行的许多规则,那么可以使用MongoDB。如果您想要一个快速的驱动程序,并且可以使用一些缺少的功能,请尝试一下:

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

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

举一个完全随机的例子:

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


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

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

  • Mongoose将更慢(对于大型应用程序)
  • Mongoose更难处理更复杂的查询
  • 在某些情况下,当你想要更高的速度时,你会选择不使用mongoose,然后你会有一半使用mongoose的查询,一半不使用mongoose。那是疯狂的情况,曾经
  • Mongoose将使用简单的应用程序和简单的数据库结构使您的代码编写速度更快
  • Mongoose会让你阅读mongodb文档和Mongoose文档
  • 有了猫鼬,你的堆栈将得到更多的依赖,这是一个更大的可能性崩溃和烧成灰烬
  • mongodb驱动程序是原始驱动程序,您可以直接与mongodb通信。 mongoose是抽象层。当您的数据库结构简单时,您可以更轻松地对数据库进行I/O