介绍
Mongoose 是一个优秀的 Node.js Object Document Mapping (ODM) 库,它可以方便地与 MongoDB 进行交互。在使用 Mongoose 进行开发时,Schema(模式)是一个非常重要的概念,它定义了 MongoDB 中 collection(集合)中文档的结构、默认值、验证规则等等,Schema 的合理设计可以帮助我们提高代码质量、减少出错率。
在本文中,我们将讨论 Mongoose Schema 的最佳设计实践,以及常见的指导性原则。我们假设你已经对 Mongoose 的基本操作有了一定的了解,比如如何连接 MongoDB、如何定义 Model 等。
1. 定义 Schema 时使用最小必要性
在定义 Schema 时,我们应该始终使用最小必要的字段去定义。这并不是说我们应该跳过合理的字段,并想着以后再来添加它们,而是要在第一次定义时将所有需要的字段都定义出来。但是,不应该将那些我们不需要的字段包含在内。
举例而言,假设我们正在定义一个 schema 来保存书籍信息,我们不应该简单地将所有的字段都添加到 schema 里面。取而代之的是,应该添加只有最基本信息的字段,比如书名、作者、出版商等等,然后根据业务需要逐渐添加更多的属性。
这种做法不仅可以使定义的 schema 更加清晰和易于维护,而且在复杂的 mongodb 环境中,还可以帮助减少内存使用。
var BookSchema = new mongoose.Schema({ title: { type: String, required: true }, author: { type: String, required: true }, publisher: String, isbn: String });
2. 使用子 Schema 进行嵌套
在 MongoDB 中,我们可以轻松地对某一个 collection 中的文档进行嵌套,这种嵌套是非常方便和实用的。在实际开发中,我们通常需要在一个 schema 中嵌套另一个 schema,这时候我们就需要使用 Mongoose 的子 Schema 功能。
举例而言,假设我们正在设计一个博客系统,它包含文章(Post)和评论(Comment)。在这种情况下,文章和评论之间就应该是关联的,我们可以使用子 Schema 来定义评论。
-- -------------------- ---- ------- --- ------------- - --- ----------------- ----------- - ----- ----- -------- -------- -- ----- - ----- ------- --------- ---- -- ------- - ----- ------------------------------- ---- ------ - --- --- ---------- - --- ----------------- ----------- - ----- ----- -------- -------- -- ------ - ----- ------- --------- ---- -- ----- - ----- ------- --------- ---- -- ------- - ----- ------------------------------- ---- ------ -- --------- --------------- ---
在上面的例子中,我们定义了两个 Schema:CommentSchema 和 PostSchema。PostSchema 中嵌套了 CommentSchema,这样就可以轻松地实现文章和评论之间的关联。
3. 使用 Schema 钩子
在 Mongoose 中,Schema 钩子用于在保存、删除或更新文档时执行某些操作。这些钩子可以使我们在文档被存入或从数据库中的删除前进行某些额外的操作,具有非常广泛的应用价值。
比如,我们可以在文档保存之前对某些字段进行自动处理。下面是一个例子,它会将文章文本中的空格去除掉。
PostSchema.pre('save', function(next) { // 将 body 中的空格去除 this.body = this.body.replace(/\s+/g, ' '); next(); });
在以上例子中,我们定义了 save 的钩子函数,它会在保存 Post 文档时被调用。在该钩子函数中,我们对去除了文章文本中的空格,然后执行 next() 表示继续执行保存操作。
4. 使用 Mongoose 自带校验器
Mongoose 提供了一些内置的验证器来帮助我们确保数据的正确性。这些验证器可以校验文档中的每一个字段,并且它们非常灵活和易于使用。
比如,我们可以使用数字验证器 (Number Validator) 来校验某个字段是否符合要求。下面是一个例子:
var UserSchema = new mongoose.Schema({ age: { type: Number, min: 18, max: 65 } });
在上面的例子中,我们定义了一个 UserSchema,其中包含了一个 age 属性,它必须是一个介于 18 和 65 之间的数字。
除了数字验证器之外,Mongoose 还提供了许多其他验证器,包括字符串验证器、日期验证器和枚举验证器等等,我们可以根据自己的业务需求选择使用。
总结
以上是关于 Mongoose Schema 的一些最佳实践和指导原则,它们可以帮助我们更好地设计和实现数据库模式,提高代码质量、可维护性和可靠性。如有疑问或意见,欢迎在评论区留言。
参考文献
- Mongoose Documentation. https://mongoosejs.com/docs/
- Medium. Best practices for MongoDB with Node.js. https://medium.com/@migueldoctor/best-practices-for-mongodb-with-node-js-7f5b1fc877ba
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a3b17648841e989400eeb8