MongoDB数组字段存在则push、不存在则初始化时出现空数组问题
MongoDB Investment集合更新deletedDocuments字段为空数组问题解决
核心问题根因
你遇到的$set执行后仅存入空数组的问题,绝大多数情况是Mongoose Schema校验规则导致的:如果你的Investment Schema对deletedDocuments数组的元素结构做了约束(比如必填字段、字段类型限制),而你传入的deletedDoc不符合约束规则,Mongoose会静默过滤掉非法元素,最终存入数据库的就只有空数组。
另外你当前的if/else分支逻辑完全冗余,MongoDB原生的$push操作符天然支持字段不存在的场景:如果目标文档没有deletedDocuments字段,$push会自动创建数组类型的字段并写入元素,不需要你手动判断字段是否存在再走$set逻辑。
排查方案
- 检查
InvestmentSchema中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
相关产品推荐
相关产品推荐

