You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB数组字段存在则push、不存在则初始化时出现空数组问题

MongoDB Investment集合更新deletedDocuments字段为空数组问题解决

核心问题根因

你遇到的$set执行后仅存入空数组的问题,绝大多数情况是Mongoose Schema校验规则导致的:如果你的Investment Schema对deletedDocuments数组的元素结构做了约束(比如必填字段、字段类型限制),而你传入的deletedDoc不符合约束规则,Mongoose会静默过滤掉非法元素,最终存入数据库的就只有空数组。

另外你当前的if/else分支逻辑完全冗余,MongoDB原生的$push操作符天然支持字段不存在的场景:如果目标文档没有deletedDocuments字段,$push会自动创建数组类型的字段并写入元素,不需要你手动判断字段是否存在再走$set逻辑。

排查方案

  • 检查Investment Schema中deletedDocuments的字段定义,确认deletedDoc的所有字段符合要求:比如字段名拼写是否正确、deletedBy是否是Schema要求的ObjectId类型、有没有遗漏必填字段。
  • 可以临时开启Mongoose debug模式,查看实际发送到MongoDB的更新语句,确认$set的参数是否正确携带了deletedDoc内容:
mongoose.set('debug', true)

优化后代码

直接删除冗余的if/else分支,仅用一段$push逻辑即可覆盖「字段已存在追加元素、字段不存在初始化数组」两种场景:

const deletedDoc = {
    _id: updatedInvestment.id,
    docType: 'CADocument',
    deletedBy: user,
    deletedDate: new Date()
}

await Investment.updateOne(
    { "_id": updatedInvestment._id },
    { $push: { "deletedDocuments": deletedDoc } }
);

内容的提问来源于stack exchange,提问作者rashidnk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:06:03