Mongoose findOneAndUpdate更新子文档数组失败问题咨询
如何正确替换MongoDB子文档数组字段?
你用$set来替换子文档数组的思路本身是没问题的,但为啥没生效呢?大概率是你用错了Mongoose的选项!
问题出在哪?
你代码里的returnNewDocument: true是原生MongoDB驱动的选项,但在Mongoose的findOneAndUpdate方法中,这个选项已经被弃用了,得换成new: true才能拿到更新后的文档。而且如果你的Mongoose版本比较新,甚至可能因为这个错误选项导致更新逻辑出问题。
另外还要先确认两个前提:
products数组的结构完全匹配StoreRequest模型里products字段的定义(比如嵌套字段的类型、是否必填这些),不然Mongoose会静默跳过这次更新。srid确实对应数据库里存在的文档ID,别拿错了ID哦。
修正后的代码
把选项换成new: true就好,代码如下:
var products = productUrlsData; // 新的文档数组 var srid = the_correct_id; StoreRequest.findOneAndUpdate( { _id: srid }, { $set: { products: products } }, { new: true } // 这里替换成new: true ) .then(function(sr) { return res.json({ sr: sr }); // 现在返回的就是更新后的文档啦 }) .catch(function(err) { return res.json({ err: err }); });
额外排查小技巧
如果还是没效果,可以试试这些:
- 手动去数据库里查一下
srid对应的文档,确认products字段是不是真的没更新(有时候返回的是旧文档,但数据库其实已经改了)。 - 加上
runValidators: true选项,强制触发模型验证,看看是不是新数组不符合验证规则导致更新失败:
{ new: true, runValidators: true }
内容的提问来源于stack exchange,提问作者valen
相关产品推荐
相关产品推荐

