MongoDB用户模型更新Balance时Payments数组无法保留历史记录的问题求助
嘿,我来帮你搞定这个问题!
问题出在哪?
你现在用的$set操作符是直接把整个payments数组给替换掉了——每次更新时,你传入的新支付对象会直接覆盖掉原来的数组,所以自然只会剩下最新的那一条。而且你代码里还有个小笔误:重复写了paymentDate键,应该是paymentCost: productCost, paymentDate: date哦。
正确的姿势:用$push追加元素
MongoDB专门有个$push操作符,就是用来往数组里加新元素的,不会覆盖原有内容。把你的更新代码改成这样就行:
// 先修正笔误,保证字段对应正确 try { // 使用$push追加支付记录,同时更新balance const updatedUser = await User.findOneAndUpdate( { _id: user._id }, { $set: { balance: currentBalance }, $push: { payments: { paymentCost: productCost, paymentDate: date } } }, { new: true } // 这个参数让方法直接返回更新后的用户文档 ); return callback(null, { ...updatedUser.toJSON() }); } catch (error) { return callback({ message: "Balance not updated" }); }
几个额外的小提示
- 别混用回调和async/await:你原来的代码里同时用了回调函数和
async/await,很容易出逻辑混乱或错误。换成上面try/catch配合async/await的写法,代码更清晰也更可靠。 - 用
new: true省事儿:加了这个参数后,findOneAndUpdate会直接返回更新后的用户数据,不用再额外执行一次findOne查询,效率更高。 - 检查变量名一致性:确认
productCost确实是你要存储的支付金额变量,别和Schema里定义的paymentCost字段搞混咯。
这样改完之后,每次更新都会把新的支付记录追加到payments数组末尾,所有历史支付记录就都能保留下来了~
内容的提问来源于stack exchange,提问作者hobik
相关产品推荐
相关产品推荐

