第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 mongooseBasic 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: usersCRUD 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 promise –
mongoose.connect()返回一个 Promise。 - Error handling – 使用
.catch()或在 async 调用周围使用try/catch。
Conclusion
Mongoose 在 MongoDB 之上添加了结构和规则,使开发者能够在 Node.js 应用中更安全、高效地管理数据。它提供模式、验证、中间件以及简洁的 CRUD API,将一个无模式的数据库转变为组织良好的数据层。