Mongoose更新MongoDB中Populate的Wallet字段不生效,求原因与解决
问题原因及解决方案
你的操作确实有误,核心问题是:populate只是把关联的Wallet文档加载到内存中的User对象里,但User集合本身只存Wallet的ID引用。你修改的是内存里的Wallet对象,但调用await contestant.save()只会更新User集合的内容,不会自动同步到Wallet集合,所以MongoDB里的Wallet数据没变化。
正确的几种处理方式:
方式1:直接找到Wallet文档修改并保存
// 从内存中的Wallet对象拿到ID,去更新Wallet集合 const wallet = await Wallet.findById(contestant.Wallet._id); wallet.cash -= Matchcontest.joiningfee; await wallet.save();
方式2:用findByIdAndUpdate直接更新(更高效)
// 直接通过ID更新,不用先查询文档 await Wallet.findByIdAndUpdate( contestant.Wallet._id, { $inc: { cash: -Matchcontest.joiningfee } }, // $inc用于增减数值,比直接赋值更安全 { new: true } // 可选,返回更新后的Wallet文档 );
方式3:保存populate出来的Wallet对象(而不是User)
如果你想沿用之前的代码逻辑,只需要把保存对象换成Wallet:
contestant.Wallet.cash -= Matchcontest.joiningfee; await contestant.Wallet.save(); // 这里保存的是Wallet文档,不是User
内容的提问来源于stack exchange,提问作者RAHUL BISHT
相关产品推荐
相关产品推荐

