能否在MongoDB游标遍历函数内部更新文档(类似Mongoose用法)?
嘿,我来帮你把这两个MongoDB相关的问题说清楚:
问题1:能否在MongoDB游标遍历函数内部更新文档?
当然可以,但得区分原生MongoDB驱动和Mongoose两种场景的实现方式:
- 如果你用的是原生MongoDB驱动:游标遍历拿到的
doc只是普通的JavaScript对象,没有内置的持久化方法。这时候要更新文档,得通过_id定位,调用updateOne()或updateMany()这类官方更新方法,比如:
db.collection.find({email:"xxx@test.com"}).forEach(doc => { db.collection.updateOne( { _id: doc._id }, { $set: { newProp: 'newValue' } } ); });
- 要是用Mongoose:游标返回的
doc是Mongoose封装的Document实例,自带save()方法,所以你可以直接在遍历里修改属性后调用save()来更新,操作更直观。
问题2:是否支持类似Mongoose的
doc.save()用法? 这得看你用的工具:
- Mongoose完全支持:你例子里写的
db.collection.find({email:"xxx@test.com"}).forEach(doc => { doc.newProp = 'newValue'; doc.save(); });在Mongoose环境下完全有效。因为Mongoose的Document实例已经封装了save()逻辑,会自动根据_id去匹配并更新数据库里的对应文档。 - 原生MongoDB驱动不支持直接这么用:原生游标返回的是纯JS对象,没有
save()方法。如果想实现类似效果,要么用前面说的updateOne(),要么考虑批量更新(比如bulkWrite()),后者在数据量较大时性能更优,示例代码如下:
const updateOps = []; db.collection.find({email:"xxx@test.com"}).forEach(doc => { updateOps.push({ updateOne: { filter: { _id: doc._id }, update: { $set: { newProp: 'newValue' } } } }); }); db.collection.bulkWrite(updateOps);
另外提醒一句:如果是批量更新大量数据,游标遍历逐个更新的效率可能不如批量操作,优先考虑bulkWrite()这类方法哦。
内容的提问来源于stack exchange,提问作者Radu Luncasu
相关产品推荐
相关产品推荐

