数据库
在 Node.js 中用 Mongoose 操作…
需要在 Node.js 应用中用 Mongoose 连接 MongoDB,并进行数据建模、增删改查、关联填充、索引、中间件与聚合分析时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Node.js 中用 Mongoos特定
解决思路
- 执行 `npm install mongoose` 安装 Mongoose。
- 在 Node.js 中用 `const mongoose = require('mongoose')` 引入 Mongoose。
- 调用 `mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true })` 连接 MongoDB。
- 注册连接事件:`mongoose.connection.on('connected', () => { console.log('MongoDB connected'); })`。
- 用 `new mongoose.Schema({...}, { timestamps: true })` 创建 `userSchema`。
- 配置 `name` 字段:`type: String`、`required: [true, 'Name is required']`、`trim: true`、`minlength: 3`、`maxlength: 50`。
- 配置 `email` 字段:`type: String`、`required: true`、`unique: true`、`lowercase: true`。
- 配置 `age` 字段:`type: Number`、`min: 18`、`max: 120`。
- 配置 `role` 字段:`type: String`、`enum: ['user', 'admin']`、`default: 'user'`。
- 在 schema 选项中开启 `timestamps: true`,自动生成 `createdAt` 和 `updatedAt`。
- 用 `const User = mongoose.model('User', userSchema)` 创建模型。
- Create 操作:用 `await User.create({ name: 'John Doe', email: 'john@example.com' })` 创建文档。
- Read 操作:用 `await User.find({ age: { $gte: 18 } })` 查询多个文档。
- Read 操作:用 `await User.findById(id)` 按 ID 查询单个文档。
- Read 操作:用 `await User.findOne({ email: 'john@example.com' })` 按条件查询单个文档。
- Update 操作:用 `await User.findByIdAndUpdate(id, { name: 'Jane Doe' }, { new: true, runValidators: true })` 更新并返回新文档、运行验证。
- Delete 操作:用 `await User.findByIdAndDelete(id)` 按 ID 删除文档。
- Delete 操作:用 `await User.deleteMany({ age: { $lt: 18 } })` 按条件批量删除文档。
- 定义 `postSchema`:包含 `title: String`、`content: String`,并用 `author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }` 建立关联。
- 填充关联:用 `await Post.findById(id).populate('author')`,使 `post.author` 变成完整 user 对象。
- Beginner 学习路径:安装 MongoDB 和 Mongoose。
- Beginner 学习路径:创建 schemas 和 models。
- Beginner 学习路径:练习 CRUD operations。
- Beginner 学习路径:练习 Basic queries。
- Intermediate 学习路径:掌握 Relationships 和 population。
- Intermediate 学习路径:掌握 Validation 和 middleware。
- Intermediate 学习路径:使用 Indexes 提升性能。
- Intermediate 学习路径:掌握 Query operators。
- Advanced 学习路径:掌握 Aggregation pipelines。
- Advanced 学习路径:掌握 Transactions。
- Advanced 学习路径:掌握 Schema design patterns。
- Advanced 学习路径:进行 Performance optimization。
- 创建唯一索引:`userSchema.index({ email: 1 }, { unique: true })`。
- 创建复合索引:`userSchema.index({ name: 1, age: -1 })`。
- 使用中间件钩子:`userSchema.pre('save', async function(next) { if (this.isModified('password')) { this.password = await bcrypt.hash(this.password, 10); } next(); })`。
- 定义虚拟属性:`userSchema.virtual('fullName').get(function() { return `${this.firstName} ${this.lastName}`; })`。
- 使用聚合管道:`User.aggregate([{ $match: { age: { $gte: 18 } } }, { $group: { _id: '$role', count: { $sum: 1 }, avgAge: { $avg: '$age' } } }, { $sort: { count: -1 } }])`。
- 比较操作符 `$gt`:`User.find({ age: { $gt: 18 } })` 查询大于。
- 比较操作符 `$gte`:`User.find({ age: { $gte: 18 } })` 查询大于等于。
- 比较操作符 `$lt`:`User.find({ age: { $lt: 65 } })` 查询小于。
- 比较操作符 `$lte`:`User.find({ age: { $lte: 65 } })` 查询小于等于。
- 比较操作符 `$ne`:`User.find({ age: { $ne: 30 } })` 查询不等于。
- 逻辑操作符 `$and`:`User.find({ $and: [{ age: { $gte: 18 } }, { age: { $lte: 65 } }] })`。
- 逻辑操作符 `$or`:`User.find({ $or: [{ role: 'admin' }, { role: 'moderator' }] })`。
- 数组操作符 `$in`:`User.find({ tags: { $in: ['node', 'mongodb'] } })`。
- 数组操作符 `$nin`:`User.find({ tags: { $nin: ['deprecated'] } })`。
- 正则查询:`User.find({ email: /gmail\.com$/ })`。
- 连接字符串使用环境变量保存。
- 为频繁查询的字段创建 indexes。
- 只读查询使用 `lean()` 以提升性能。
- 在 schema 层验证数据。
- 多文档操作使用 transactions。
- 正确处理连接错误。
- 应用关闭时关闭连接。
适用边界 · 注意事项
- 需要严格关系模型、复杂多表 JOIN 或成熟 SQL 约束与复杂事务语义时,优先考虑关系型数据库。
- 项目不能引入 MongoDB 服务或 Mongoose 依赖时,不要使用本技能。
- 对强一致性和多文档事务要求极高,但 MongoDB 未配置副本集时,不应依赖 MongoDB transactions。