当前位置: 首页 > news >正文

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();

});

相关文章:

  • 小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面
  • Page Assist - 本地Deepseek模型 Web UI 的安装和使用
  • Spring Cloud 服务调用 Feign
  • C++:iterator迭代器失效
  • c++播放音频
  • top命令输出内容详解
  • 【设计模式】【创建型模式】建造者模式(Builder)
  • FreeRTOS-rust 编译分析
  • 【C++】实现一个JSON解析器
  • ubuntu上如何查看coredump文件默认保存在哪个路径?
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑲】
  • Xilinx FPGA工程移植步骤---包含软核工程
  • LeetCode刷题---哈希表---215
  • Jedis 客户端 用于java连接redis服务
  • Vue3 打造 Windows 桌面个性高效组件工具
  • git clone
  • Java运算符
  • 【原创】Ubuntu 22安装nexus私服
  • LeetCode刷题---哈希表---451
  • Kubernetes Pod健康检查全解析:从Liveness到滚动更新,掌握容器健康管理的核心技巧
  • 农行深圳市分行原副行长王国彪涉嫌严重违纪违法被查
  • 人民时评:莫让“假俗乱”讲解侵蚀“文博热”
  • 非洲雕刻艺术有着怎样的“变形之美”
  • 铁肩担道义,历史鉴未来——中共中央政治局委员、外交部长王毅谈习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点
  • “爱鸟周”为何不能像FI和花展那样“市区联动”