📜  mongoose 获取价值 - Javascript (1)

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

Mongoose 获取价值 - Javascript

Mongoose是一个支持Node.js和MongoDB的Object Document Mapper(ODM)库,通过在MongoDB上提供schemas、模型和查询构建,使得Node.js和MongoDB应用程序的开发变得更加容易。在本文中,我们将介绍Mongoose如何为Node.js和MongoDB开发人员带来价值。

1. Schemas

Mongoose的关键部分是schemas,它为MongoDB中的collections定义了一个结构。schemas包含了每个文档中可以存在的键以及其类型和验证规则。使用schemas可以确保文档的一致性,并避免数据中存在未定义的字段。以下是一个简单的Mongoose schema示例:

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, unique: true, required: true },
  password: { type: String, required: true },
});

module.exports = mongoose.model('User', userSchema);

在上面的示例中,我们定义了一个名为“User”的collection的schema。schema定义了三个键:name、email和password。其中,name和password的类型为String,且必须存在,而email的类型也是String,但必须唯一存在。通过使用schemas,我们不仅可以保证文档的一致性,而且还可以通过设置键的类型和验证规则来防止可能的输入错误。

2. Models

在Mongoose中,Model是schemas的编译版本。它们是用于MongoDB文档的构造函数,可以用于查询和保存documents。Model还提供了许多有用的方法,例如插入、查找、更新和删除文档。以下是一个模型的简单示例:

const UserModel = require('./userModel');

const newUser = new UserModel({
  name: 'John Doe',
  email: 'johndoe@example.com',
  password: 'password123',
});

newUser.save()
  .then((user) => {
    console.log(user);
  })
  .catch((error) => {
    console.log(error.message);
  });

在上面的示例中,我们创建了一个名为“User”的collection,并添加了一个新的document(即一个名为“John Doe”的用户)。然后,我们使用新document的save方法将其保存到数据库中。Model还提供了许多根据条件查找和更新collection的方法,例如findById、findOne和updateOne等。

3. Middleware

Mongoose还提供了一种称为middleware的机制,可以在Model保存或更新document之前或之后执行某些操作。这些操作可以是同步或异步的,可以是指定函数或就地编写的匿名函数。以下是一个简单的middleware示例:

const userSchema = mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, unique: true, required: true },
  password: { type: String, required: true },
});

userSchema.pre('save', function(next) {
  bcrypt.hash(this.password, 10, (err, hash) => {
    if (err) {
      return next(err);
    }
    this.password = hash;
    next();
  });
});

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

在上面的示例中,我们在UserModel的“save”事件之前使用bcrypt散列用户密码。这个middleware确保了密码的安全性,并帮助我们避免了加密处理的一些常见错误。

4. 数据验证

使用Mongoose,我们可以在schemas中定义验证规则,从而保证输入数据的正确性。在schemas中定义的验证规则可以是自定义的函数,也可以是内置的验证器。以下是示例:

const userSchema = mongoose.Schema({
  name: { type: String, required: true },
  email: {
    type: String,
    unique: true,
    required: true,
    validate: (value) => {
      return validator.isEmail(value);
    },
  },
  password: {
    type: String,
    required: true,
    validate: [{
      validator: (value) => {
        return value.length >= 8;
      },
      message: 'Password must be at least 8 characters long',
    }],
  },
});

在上面的示例中,我们为UserModel中的email字段和password字段添加了验证。email的验证使用了一个自定义的函数,以确保传入的值是一个有效的电子邮件地址。password的验证使用了Mongoose内置的验证器,以确保密码长度至少为8个字符。

结论

Mongoose库极大地简化了Node.js和MongoDB应用程序的开发。使用Mongoose的编辑版本schemas,我们能够保证数据库的数据一致性,并且防止错误的输入。Models提供了用于文档的构造和操作的统一接口。middleware提供了在保存或更新文档之前或之后执行某些操作的机制。Mongoose还提供了数据验证的支持,使我们得以快速、轻松地进行输入数据的验证。