Mongoose 中的 Schema 建立规范及细节注意事项

在 Node.js 中,Mongoose 是一个非常流行的用于操作 MongoDB 数据库的 ORM 框架。在 Mongoose 中,Schema 是定义 MongoDB 数据库中数据结构的核心概念,它定义了集合中的文档的属性、类型、默认值等信息。本文将介绍 Mongoose 中的 Schema 建立规范及细节注意事项,帮助读者更好地使用 Mongoose 进行开发。

1. 定义 Schema

在 Mongoose 中,可以使用 Schema 构造函数来定义一个 Schema,如下所示:

const { Schema } = require('mongoose');

const userSchema = new Schema({
  name: String,
  age: Number,
  email: String,
});

上面的代码定义了一个名为 userSchema 的 Schema,它包含了三个属性:nameageemail。其中,nameemail 属性的类型为 String,age 属性的类型为 Number。

2. Schema 类型

在 Mongoose 中,支持的 Schema 类型包括了以下几种:

  • String:字符串类型。
  • Number:数字类型。
  • Date:日期类型。
  • Buffer:二进制数据类型。
  • Boolean:布尔类型。
  • Mixed:混合类型,可以存储任意类型的数据。
  • ObjectId:文档 ID 类型。
  • Array:数组类型。

可以根据实际需要选择不同的类型。

3. Schema 属性

在定义 Schema 时,可以为每个属性指定一些属性,如下所示:

const userSchema = new Schema({
  name: {
    type: String,
    required: true,
    trim: true,
  },
  age: {
    type: Number,
    min: 0,
    max: 120,
  },
  email: {
    type: String,
    required: true,
    unique: true,
    lowercase: true,
  },
});

上面的代码中,为每个属性指定了不同的属性。如 name 属性指定了 requiredtrim 属性,age 属性指定了 minmax 属性,email 属性指定了 requireduniquelowercase 属性。

下面是常用的属性说明:

  • type:指定属性的类型。
  • required:指定属性是否必须。
  • default:指定属性的默认值。
  • min:指定属性的最小值。
  • max:指定属性的最大值。
  • enum:指定属性的枚举值。
  • match:指定属性的正则表达式。

4. Schema 方法

在 Mongoose 中,Schema 还可以定义一些方法,如下所示:

const userSchema = new Schema({
  name: String,
  age: Number,
  email: String,
});

userSchema.methods.getFullName = function() {
  return `${this.firstName} ${this.lastName}`;
};

上面的代码中,定义了一个名为 getFullName 的方法,用于获取用户的全名。

5. Schema 静态方法

除了实例方法之外,Schema 还可以定义静态方法,如下所示:

const userSchema = new Schema({
  name: String,
  age: Number,
  email: String,
});

userSchema.statics.findByName = function(name) {
  return this.find({ name });
};

上面的代码中,定义了一个名为 findByName 的静态方法,用于根据用户名查找用户。

6. Schema 中间件

在 Mongoose 中,Schema 还支持中间件,用于在执行某些操作之前或之后执行一些代码。如下所示:

const userSchema = new Schema({
  name: String,
  age: Number,
  email: String,
});

userSchema.pre('save', function(next) {
  this.updatedAt = new Date();
  next();
});

上面的代码中,定义了一个名为 save 的中间件,用于在保存文档之前更新 updatedAt 属性。

7. 注意事项

在使用 Mongoose 进行开发时,需要注意以下几点:

  • Schema 中的属性名称应该与数据库中的字段名称保持一致。
  • 不要在 Schema 中定义与 MongoDB 内置方法同名的方法,否则可能会导致意想不到的结果。
  • Schema 中的属性名称不要与 Mongoose 的内置方法或属性同名,否则可能会导致意想不到的结果。
  • 在定义 Schema 时,应该尽可能地使用 Schema 类型,以便 Mongoose 可以正确地转换数据类型。
  • 在定义 Schema 属性时,应该尽可能地指定属性类型和属性选项,以便 Mongoose 可以对数据进行正确的验证和转换。

8. 示例代码

下面是一个完整的示例代码,用于演示如何定义一个名为 User 的 Schema,并使用它创建一个名为 users 的集合:

const mongoose = require('mongoose');
const { Schema } = mongoose;

// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost/test', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// 定义 User Schema
const userSchema = new Schema({
  name: {
    type: String,
    required: true,
    trim: true,
  },
  age: {
    type: Number,
    min: 0,
    max: 120,
  },
  email: {
    type: String,
    required: true,
    unique: true,
    lowercase: true,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
  updatedAt: {
    type: Date,
    default: Date.now,
  },
});

// 定义 User 实例方法
userSchema.methods.getFullName = function() {
  return `${this.firstName} ${this.lastName}`;
};

// 定义 User 静态方法
userSchema.statics.findByName = function(name) {
  return this.find({ name });
};

// 定义 User 中间件
userSchema.pre('save', function(next) {
  this.updatedAt = new Date();
  next();
});

// 创建 User 模型
const User = mongoose.model('User', userSchema);

// 创建并保存一个 User 文档
const user = new User({
  name: 'John',
  age: 30,
  email: 'john@example.com',
});

user.save((err, doc) => {
  if (err) {
    console.error(err);
    return;
  }

  console.log(doc);
});

9. 总结

本文介绍了 Mongoose 中的 Schema 建立规范及细节注意事项,包括了如何定义 Schema、Schema 类型、Schema 属性、Schema 方法、Schema 静态方法、Schema 中间件等内容。希望读者能够通过本文的介绍,更好地使用 Mongoose 进行开发。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bd93ecadd4f0e0ff746f4e