📜  定义 Schema mongoose - Javascript (1)

📅  最后修改于: 2023-12-03 15:39:07.585000             🧑  作者: Mango

定义 Schema Mongoose - JavaScript

Mongoose 是一款优秀的 MongoDB 驱动程序,它提供了强大的数据建模能力,并且非常易于学习和使用。在使用 Mongoose 进行 CRUD 操作之前,我们必须先定义数据模型,这就需要用到 Mongoose 的 Schema。

什么是 Schema?

Schema 可以看做是一个基于数据结构的表结构,它描述了一个 Collection 中 Document 的属性和类型,以及可选的验证规则、默认值和虚拟属性等。我们可以使用 Mongoose 定义一个 Schema,然后根据这个 Schema 创建一个 Model,并且对这个 Model 进行 CURD 操作。

如何定义 Schema?

下面是一个简单的示例,我们定义了一个名为 User 的 Schema,它包含了一个 name 字段和一个 age 字段:

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

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

const User = mongoose.model('User', userSchema);

module.exports = User;

首先,我们需要引入 Mongoose 并且获取 Schema 对象。然后我们通过 new 操作符创建了一个新的 Schema 对象,这个 Schema 中包含了我们需要的字段和验证规则。其中,name 字段类型为 String,并且是必填的,而 age 字段类型为 Number,是可选的。

最后,我们使用 mongoose.model 方法创建了一个名为 User 的 Model,并将其导出。

Schema 的字段类型

Mongoose 支持的字段类型有很多,下面是一些常见的类型:

  • String
  • Number
  • Date
  • Boolean
  • Array
  • ObjectId
  • Decimal128
  • Buffer

除此之外,Mongoose 还支持自定义的 Schema 类型,我们可以通过 mongoose.Schema.Types 来定义自己的类型。例如,我们可以定义一个包含经度和纬度的 GeoSchema 类型:

const geoSchema = new Schema({
  type: {
    type: String,
    default: 'Point'
  },
  coordinates: {
    type: [Number],
    required: true
  }
});

const storeSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  location: geoSchema
});

const Store = mongoose.model('Store', storeSchema);

module.exports = Store;
Schema 的验证规则

在定义 Schema 的字段时,我们可以为每个字段设置验证规则。Mongoose 提供了很多内置的验证器,也支持自定义的验证器。下面是一些常见的验证规则:

  • required:必填项
  • min / max:数字类型的最小值 / 最大值
  • minlength / maxlength:字符串类型的最小长度 / 最大长度
  • enum:枚举类型,值必须在指定的枚举列表中
  • match:正则表达式匹配
  • validate:自定义验证器

例如,我们可以为 Username 字段设置验证规则:

const userSchema = new Schema({
  name: {
    type: String,
    required: [true, 'Name is required'],
    minlength: [2, 'Name must be at least 2 characters'],
    maxlength: [50, 'Name must be at most 50 characters']
  },
  age: Number
});
Schema 的默认值

我们可以为 Schema 中的字段设置默认值,当创建新的 Document 时,如果该字段未提供值,则会自动使用默认值。例如:

const userSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  age: {
    type: Number,
    default: 18
  }
});

在创建新的 User 时,如果未提供 age,则会默认使用 18

Schema 的虚拟属性

除了 Schema 中的真实属性,我们还可以定义虚拟属性,虚拟属性可以根据真实属性计算得出,但它不会保存到数据库中。例如,我们可以为 User 添加一个虚拟属性 fullName,它根据 firstNamelastName 计算得出:

const userSchema = new Schema({
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  }
});

userSchema.virtual('fullName').get(function() {
  return this.firstName + ' ' + this.lastName;
});

const User = mongoose.model('User', userSchema);

module.exports = User;

在查询 User 时,我们可以获取到该虚拟属性:

const user = await User.findOne({ _id: '12345' });
console.log(user.fullName);
总结

通过本文,我们了解到了 Mongoose 中 Schema 的定义方法,以及常用的字段类型、验证规则、默认值和虚拟属性。在实际开发中,我们可以根据实际需求来定义自己的 Schema 和 Model,并通过 Mongoose 来进行数据的 CRUD 操作。