Mongoose 详解
为 Node.js 与 MongoDB 之间提供了一个更高级、更便捷的交互方式。
一、安装
# 使用 npm 安装
npm install mongoose 
二、基本使用
1. 连接数据库
const mongoose = require("mongoose");
// 数据库连接 URI
const uri = "mongodb://localhost:27017/myDatabase";
// 连接到 MongoDB
mongoose.connect(uri, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
// 获取数据库连接对象
const db = mongoose.connection;
// 监听连接成功事件
db.on("connected", () => {
  console.log("Connected to MongoDB");
});
// 监听连接错误事件
db.on("error", (err) => {
  console.error("MongoDB connection error:", err);
}); 
2. 定义数据模型
数据模型是基于 Schema 定义的。Schema 定义了文档的结构和数据类型,而模型则是基于 Schema 创建的构造函数,用于操作数据库中的文档。
// 定义 Schema
const userSchema = new mongoose.Schema({
  name: String,
  age: Number,
  email: {
    type: String,
    unique: true,
  },
});
// 创建模型
const User = mongoose.model("User", userSchema); 
三、文档操作
1. 创建文档
使用模型的构造函数创建一个新的文档实例,然后调用 `save()` 方法将其保存到数据库中。
const newUser = new User({
  name: "John",
  age: 30,
  email: "john@example.com",
});
newUser
  .save()
  .then((savedUser) => {
    console.log("Saved user:", savedUser);
  })
  .catch((err) => {
    console.error("Error saving user:", err);
  }); 
2. 查询文档
使用模型的静态方法(如 `find()`、`findOne()` 等)来查询文档。
// 查询所有用户
User.find()
  .then((users) => {
    console.log("All users:", users);
  })
  .catch((err) => {
    console.error("Error finding users:", err);
  });
// 根据条件查询单个用户
User.findOne({ name: "John" })
  .then((user) => {
    console.log("User:", user);
  })
  .catch((err) => {
    console.error("Error finding user:", err);
  }); 
3. 更新文档
使用模型的静态方法(如 `updateOne()`、`updateMany()` 等)或文档实例的 `update()` 方法来更新文档。
// 更新单个文档
User.updateOne({ name: "John" }, { age: 31 })
  .then((result) => {
    console.log("Update result:", result);
  })
  .catch((err) => {
    console.error("Error updating user:", err);
  }); 
4. 删除文档
使用模型的静态方法(如 `deleteOne()`、`deleteMany()` 等)来删除文档。
// 删除单个文档
User.deleteOne({ name: "John" })
  .then((result) => {
    console.log("Delete result:", result);
  })
  .catch((err) => {
    console.error("Error deleting user:", err);
  }); 
5. 数据验证
`mongoose` 提供了强大的数据验证功能,可以在 Schema 中定义验证规则,确保插入或更新的数据符合要求。如下:`name` 字段是必需的,`age` 字段的取值范围在 18 到 100 之间,`email` 字段有唯一约束,并且使用自定义的验证函数来验证邮箱格式。
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  age: {
    type: Number,
    min: 18,
    max: 100,
  },
  email: {
    type: String,
    unique: true,
    validate: {
      validator: function (value) {
        return /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(value);
      },
      message: "Invalid email address",
    },
  },
}); 
四、中间件
`mongoose` 支持中间件,允许在文档保存、更新、删除等操作前后执行自定义逻辑。
userSchema.pre("save", function (next) {
  // 在保存文档之前执行的逻辑
  console.log("Before saving user:", this);
  next();
});
userSchema.post("save", function (doc, next) {
  // 在保存文档之后执行的逻辑
  console.log("After saving user:", doc);
  next();
}); 
                