我一直在一个新项目中使用它,但这也是我第一次使用 MongoDB。定义模式似乎没有必要,因为我认为 mongo 的好处是它不需要定义的方案。无论架构如何,我都不能即时保存对象吗?那我为什么要呢?此外缺少文档,使我可以在 mongo shell 中轻松完成的一些事情变得比它们应该做的更难。
4 回答
Mongoose for MongoDB 最好的一点是,您可以对正在插入/更新的数据进行内置的自动验证。Mongoose 还使您能够预先定义要发生的事件,例如,在保存文档之前。这是非常强大的,因为它整合了您必须编写的代码,并将该代码放置在它应该靠近文档逻辑而不是应用程序逻辑的位置。
查看中间件和验证以获取一些示例。Github 上的 alexyoung/Nodepad 在models.js 文件中有一些很好的示例。
事先了解定义的模式会很方便,因为这样您就可以做出否则可能无法做到的假设。
例如,如果我有一个Post
模式,那么我可以假设它有一个body
字段并将其用作 aString
而无需检查它的存在。
当然,即使在我定义明确的模型上,我也可以在其中拥有相当于无模式文档的内容,例如
mongoose.model('Post', new Schema({
body: String,
meta: {}
}));
然后我可以非常简单地将随机数据添加到 myPost.meta 中。它为我在定义的模式和无模式之间提供了一个非常好的平衡。
你真的可以去任何一种方式。在许多其他语言中,MongoDB 有许多流行的映射器:Java 的 Morphia、PHP 的 Doctrine、Ruby 的 Mongoid / Mongomapper 等。
即使 MongoDB 是“无模式的”,它也不是“无模式的”。关于知道从数据库中得到什么,有话要说。
当然,构建一个临时对象并保存它也有一些优雅的地方。在这一点上,node.js 是非常新的,最好使用你喜欢的东西。
此外缺少文档,使我可以在 mongo shell 中轻松完成的一些事情变得比它们应该做的更难。
Mongoose 仍然是一个社区项目,而且相对较新。如果缺少文档或需要编写文档,我相信开发团队会喜欢帮助。您可能会在群组中与他们联系。
我用过 Mongoose,我不得不说我完全同意事先定义你的 Schema 会严重限制 MongoDB。Mongoose 背后的想法是使其安全并易于维护,但并不真正吸引基于文档的数据库。