使用Mongoose更新MongoDB数据时出现save is not a function错误
问题原因与修复方案
错误原因
你调用result.save()报错是因为**find()方法返回的是文档数组**,而非单个Mongoose文档对象。数组本身没有save()方法,所以会抛出"save is not a function"的错误。
修复方案
方案1:直接批量更新(推荐)
如果需求是更新所有符合条件的文档,没必要先查询再逐个保存,用updateMany()更高效:
const mySchema = require('../models/schemaPath') mySchema.updateMany({}, { $set: { myData: 'someData' } }) .then(() => { console.log('Done') }) .catch((err) => { console.log(err) })
- 第一个空对象
{}表示匹配所有文档,可根据需求添加查询条件 $set是MongoDB的更新操作符,用于设置字段值
方案2:遍历查询结果逐个保存
如果必须先查询文档再做自定义处理后保存,需要遍历find()返回的数组,对每个文档单独调用save():
const mySchema = require('../models/schemaPath') mySchema.find() .then(async(results) => { for (const doc of results) { doc.myData = 'someData'; // 或者用Object.assign(doc, { myData: 'someData' }) await doc.save(); } console.log('Done') }) .catch((err) => { console.log(err) })
方案3:查询单个文档
如果目标是更新单个文档,用findOne()代替find(),它返回单个Mongoose文档对象,可直接调用save():
const mySchema = require('../models/schemaPath') mySchema.findOne() // 可添加查询条件,比如findOne({ _id: 'xxx' }) .then(async(result) => { if (!result) { console.log('未找到文档'); return; } result.myData = 'someData'; await result.save(); console.log('Done') }) .catch((err) => { console.log(err) })
内容的提问来源于stack exchange,提问作者seriously
相关产品推荐
相关产品推荐

