Mongoose调用Model.update向数组push元素时提示‘Model.update is not a function’
解决Mongoose中
Model.update is not a function报错并实现数组push操作 报错根源
这个问题我太熟悉了——从Mongoose 6.x版本开始,官方彻底移除了Model.update()这个旧的通用更新方法,取而代之的是语义更精准的Model.updateOne()(更新单个文档)、Model.updateMany()(更新多个文档)和Model.findOneAndUpdate()(找到文档并更新,可返回更新后的结果)。你现在调用的update方法已经不存在了,所以才会抛出这个错误。
针对你的需求的解决方案
你的目标是向Others数组中push新元素,推荐用findOneAndUpdate()或者updateOne()配合MongoDB的$push操作符来实现,下面是具体的代码示例:
方案1:使用findOneAndUpdate()(推荐,可直接获取更新后的文档)
如果你需要更新后立刻拿到更新好的完整文档,可以这么写:
// 假设你的Model名称是Category const updatedCategory = await Category.findOneAndUpdate( { _id: "目标文档的ID" }, // 查询条件,定位要更新的文档 { $push: { Others: { /* 这里传入符合CategoryDynamiqueSchema结构的新元素对象 */ } } }, // 用$push往数组里追加元素 { new: true, runValidators: true } // new: true 返回更新后的文档;runValidators: true 确保新元素符合Schema校验规则 ); if (!updatedCategory) { console.log("未找到要更新的分类文档"); } else { console.log("更新完成后的文档:", updatedCategory); }
方案2:使用updateOne()(仅执行更新,不返回文档)
如果不需要返回更新后的文档,只需要完成更新操作,可以用这个更轻量的方法:
const result = await Category.updateOne( { _id: "目标文档的ID" }, // 查询条件 { $push: { Others: { /* 你的新元素对象 */ } } } ); console.log(`匹配到${result.matchedCount}个文档,成功更新${result.modifiedCount}个文档`);
额外实用提示
- 如果你还在使用Mongoose 5.x版本,
Model.update()其实还能生效,但官方已经标记为废弃,建议尽快升级版本并改用新方法。 - 要确保
CategoryDynamiqueSchema已经正确定义并引入,否则往Others数组添加元素时可能触发校验错误。 - 如果需要一次push多个元素,可以用
$push配合$each:{ $push: { Others: { $each: [元素1, 元素2, 元素3] } } }
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

