mongoosevs mongodb(nodejs modules / extensions),哪个更好? 为什么?

我刚到Node.js,看到MongoDB有很多libs,最stream行的就是这两个:(mongoose和mongodb)。 我可以得到这些扩展的优点和缺点吗? 这两个有更好的select吗?

编辑:find一个新的库,似乎也有趣的节点蒙古语,是“蒙古DeadBeef是一个超棒的Mongo DB node.js驱动程序,试图密切近似的蒙古语shell。 (readme.md)

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

这只是为了增加更多资源给那些认为这个的新人,所以基本上蒙古人就像一个ODM …

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

如果你想要一个驱动程序,因为你打算打破ODM可能强制执行的许多规则,那就使用MongoDB。 如果你想要一个快速的驱动程序,并可以忍受一些缺失的function,给蒙古DeadBeef一个尝试: https : //github.com/marcello3d/node-mongolian

mongoose是迄今为止最受欢迎的。 我使用它,并没有使用其他人。 所以我不能说其他人,但我可以告诉你我对Mongoose的抱怨。

  • 困难/差的文件
  • 使用模型 。 他们为你的文件定义结构。 然而这对于Mongo而言似乎很奇怪,它的一个优点是可以抛出一个列(err,attribute?)或者简单地不加一个列。
  • 模型是区分大小写的 – 与我一起工作的我自己和其他开发人员遇到问题,模型定义的集合名称的情况会导致它不保存任何内容,不出现错误。 我们发现使用全部小写名称效果最好。 例如,不要做像mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String }) ,最好做(即使集合名称真的是MyCollection ): mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

但说实话,这真的很有用。 最大的问题是文档。 它在那里,但是很难find你所需要的。 它可以使用更好的解释和更多的例子。 但是一旦你通过这些东西,它真的很好。

我正在构build新的应用程序和devise它的结构,这里有一些想法,为什么要使用或不使用mongoose:

  1. mongoose会变慢(对于大的应用程序)
  2. mongoose更难以处理更复杂的查询
  3. 有些情况下,如果你想要更快的速度,你会select没有mongoose,那么你将有一半的mongoose和一半W / O的查询。 这是疯狂的情况,曾经..
  4. Mongoose将使您使用简单的数据库结构简单的应用程序更快的代码
  5. mongoose会让你阅读mongodb文档和mongoose文档
  6. 随着mongoose你的堆栈将得到一个更多的东西来依靠,这是一个更多的可能性崩溃和烧成灰烬。

mongodb驱动程序是原始驱动程序,您直接与mongodb进行通信。 mongoose是抽象层。 数据库的db结构非常简单,你可以更容易地使用db。

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

没有mongoose,你将有更快的应用程序直接连接到mongodb。 没有人说,你不能写你自己的模型来保存东西到数据库。 您可以。 我觉得这很容易。 你写代码,你会使用,你知道你需要什么。 你抽象层会变小,然后是mongoose的。

我来自PHP世界,我们有原始的SQL与折旧的mysql_函数,然后我们得到PDO – 面向对象的抽象层与SQL进行通信。 或者你可以select像Doctrine这样的重型ORM在mongoDB上有类似的东西mongoose。 对象具有setter / getters / save方法等等。 这很好,但通过添加更多的抽象,您将添加更多的文件,更多的逻辑,更多的文档,更多的依赖关系。 我喜欢保持简单的东西,并有更less的依赖关系在我的堆栈中。 顺便说一句,这就是为什么我从PHP移动到服务器客户端JavaScript的第一位。

用mongoose,我认为写一些简单的应用程序是非常好的,它有简单的数据库结构类似于SQL 。 当你开始有子文件,想要使所有这些疯狂的查询,我发现它真的很难用mongoose。 您必须查看mongodb文档,然后查看mongoose文档以了解如何进行查询。 有时候你会发现,MongoDB的X未来并不是mongoose,所以你去找原始的MongoDB驱动程序,并且在某个地方写下原始的MongoDB查询。 没有mongoose,你看看mongodb文档,并做你的查询。

我只用了mongodb。 我个人认为,我会build议开始低水平的东西,然后向上移动。 否则,您可能会发现自己正在使用像mongoose这样的高级驱动程序提供的附加高级function,而没有实际的好处。

我对mongodb的问题是node.js特有的,那就是糟糕的文档。 有文件和很多,但它并不总是最有帮助的。 到目前为止,我没有看到驱动程序的生产使用情况。 该文档充满了打开连接的相同模板化示例,发出命令并closures连接。 您可以告诉它是从模板中复制并粘贴的,因为每个示例都包含了所需的所有内容,而不仅仅是每个示例所需的内容。

举一个完全随机的例子:

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

究竟是什么“使用原始的bson缓冲区执行操作”呢? 我无法在任何地方find解释,Googlesearch这个短语也无济于事。 也许我可以进一步Google,但我不应该。 信息应该在那里。 是否有任何性能,稳定性,完整性,兼容性,便携性或function优势来启用/禁用此选项? 如果没有深入了解代码,我真的不知道,如果你在我的船上,这是一个严重的问题。 我有一个守护进程,不需要完美的持久性,但程序在运行时需要非常稳定。 我可以假设这意味着它期望我反序列化和序列化为JSON,或者对用户而言是低层次的,内部的和透明的,但是我可能是错的。 虽然我倾向于做出很好的假设,但在做重要的系统时,我不能依靠假设和猜测。 所以在这里我可以用代码来testing我的断言,或者深入挖掘Google或者他们的代码。 作为一个这样的事情并不是那么糟糕,但是在阅读他们的文档时,我多次在这种情况下find自己。 差异可能意味着花在一个任务上的时间与几个小时。 我需要确认和文件勉强给我解释,更不用说确认。

该文件是冲。 它没有解释事件,给出了什么时候出现错误或者错误的性质的模糊细节,并且通常有几种方法可以完成不清楚的连接。 你可以通过它并不完全无用,但它周围是非常粗糙的。 你会发现一些东西是猜测和实验。