第33天 #100DaysOfCode — Mongoose

发布: (2026年3月7日 GMT+8 09:45)
4 分钟阅读
原文: Dev.to

Source: Dev.to

Introduction

数据库可以存储任意数量或类型的数据,但默认情况下它们通常不会强制严格的结构。
MongoDB 是无模式(schema‑less)的,这意味着它不强制严格的结构。为了保持结构、验证和一致性,开发者使用 Mongoose——一个针对 MongoDB 和 Node.js 的对象数据建模(ODM)库。

Why Mongoose?

  • 提供模式(schemas)、验证和模型(models)。
  • 充当 Node.js 与 MongoDB 之间的层,使大型应用更清晰、更安全、更易于维护。
  • 支持中间件、默认值以及必填字段的强制。

Without Mongoose

// raw MongoDB driver
const db = client.db("MyDatabase");
await db.collection("users").insertOne({ name: "Saad", age: 25 });
const users = await db.collection("users").find().toArray();
  • 没有验证 → 垃圾数据可能被插入。
  • 没有一致的结构 → 查询在不同开发者之间会各不相同。
  • 没有钩子 → 必须手动处理重复任务(例如密码哈希)。

With Mongoose

await User.create({ name: "Saad", age: 25 });

Mongoose 提供了干净、结构化且经过验证的交互方式。

Installing Mongoose

npm install mongoose

Basic Import & Connection

const mongoose = require("mongoose");

const uri = "mongodb://127.0.0.1:27017/testdb";

async function run() {
  await mongoose.connect(uri);
  console.log("Connected");

  // ... your code ...

  await mongoose.disconnect();
}

run().catch(console.error);

Defining a Schema

Schema 定义了 MongoDB 集合中文档的结构。

const userSchema = new mongoose.Schema({
  name: String,
  age: Number,
  isWorking: Boolean,
});

Advanced Schema Example (validation, defaults)

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  age: Number,
  email: { type: String, required: true },
  createdAt: { type: Date, default: Date.now },
  skills: [String],
});

模式帮助定义:

  • 字段类型
  • 数组和嵌套对象
  • 必填字段
  • 默认值

Creating a Model

Model 是用于与集合交互的接口。

const User = mongoose.model("User", userSchema); // collection: users

CRUD Operations with Mongoose

// Create
await User.create({ name: "Saad", age: 26, isWorking: false });

// Read
const users = await User.find();               // all users
const user = await User.findOne({ name: "Saad" });
const filtered = await User.find({ age: { $gt: 20 } });

// Update
await User.updateOne({ name: "Saad" }, { age: 24 });

// Delete
await User.deleteOne({ name: "Saad" });

Comparison with raw MongoDB queries

// MongoDB
db.users.find({ age: { $gt: 20 } });

// Mongoose
User.find({ age: { $gt: 20 } });

两者相似,但 Mongoose 返回遵循已定义模式的 JavaScript 对象。

Key Concepts

  • MongoDB URI – 数据库的连接字符串。
  • Connection promisemongoose.connect() 返回一个 Promise。
  • Error handling – 使用 .catch() 或在 async 调用周围使用 try/catch

Conclusion

Mongoose 在 MongoDB 之上添加了结构和规则,使开发者能够在 Node.js 应用中更安全、高效地管理数据。它提供模式、验证、中间件以及简洁的 CRUD API,将一个无模式的数据库转变为组织良好的数据层。

0 浏览
Back to Blog

相关文章

阅读更多 »