5月29日 01:09

Mongoose Model 的 CRUD 方法有哪些,查询性能怎么优化?

Mongoose Model 常用 CRUD 方法:创建用 create()insertMany();查询用 find()findOne()findById();更新用 updateOne()findByIdAndUpdate(id, update, {new: true});删除用 deleteOne()findByIdAndDelete()。链式查询支持 .select() 投影、.sort() 排序、.limit() 分页、.populate() 联查。findByIdAndUpdate 默认返回修改前文档,需传 {new: true} 获取更新后数据。

追问

find() 返回的结果和 lean() 有什么区别? find() 返回 Mongoose Document 实例,支持修改后 save()、虚拟字段、中间件;lean() 返回纯 JS 对象,内存占用低、查询速度快约 1.5-3 倍。只读展示场景务必用 lean(),需要修改并保存时才用 Document 实例。

findByIdAndUpdate 能触发 save 中间件吗? 不能。pre('save') 和 post('save') 只在 doc.save() 时触发。updateOne/findByIdAndUpdate 触发的是 pre('updateOne')pre('findOneAndUpdate') 钩子。这是面试高频陷阱。

批量操作用 insertMany 还是 bulkWrite? insertMany 只支持批量插入;bulkWrite 支持 insertOne/updateOne/deleteOne 混合操作,且底层走 MongoDB 的 bulk 协议,单次网络往返完成,性能更优。混合写操作场景优先 bulkWrite。

countDocuments 和 estimatedDocumentCount 有什么区别? countDocuments 执行真实 COUNT 查询,支持过滤条件,结果精确;estimatedDocumentCount 读集合元数据估算,不支持条件,速度极快。无过滤条件的计数场景用 estimatedDocumentCount 更高效。

写段代码

js
// 批量混合操作 await User.bulkWrite([ { updateOne: { filter: { name: 'Tom' }, update: { $inc: { age: 1 } } } }, { insertOne: { document: { name: 'Jerry', age: 20 } } }, { deleteOne: { filter: { name: 'Old' } } } ]); // 只读查询用 lean const users = await User.find({ age: { $gte: 18 } }) .select('name age').sort({ age: -1 }).lean();
标签:Mongoose