FindOneAndUpdate 子文档数组在猫鼬中删除文档而不是更新

时间:2021-03-15 18:23:27

标签: mongodb mongoose

嗨,伙计们,我需要您对以下代码的帮助,我想更新 mongoose 中的子文档

代码如下:

    const update = await Model.findOneAndUpdate({
  _id: id,
  "sponsors._id": sponsorId
}, {
  $set: {
    "sponsors.$": req.body
  }
}, {
  new: true
});

if (!update) {
  return next(
    new AppError("Something went wrong! Please try again later.", 400)
  );
}

然而这段代码宁愿删除子文档并创建一个新的,我已经浏览了文档,这恰好是更正的方式,但我只是不明白为什么它宁愿删除而不是更新。

请帮忙

1 个答案:

答案 0 :(得分:0)

MongoDB 正在替换子文档,因为这正是更新语句告诉它要做的事情。

位置运算符$指的是匹配的子文档,更新sponsors.$中的字段名是告诉MongoDB将匹配的子文档的值设置为req.body

要在该子文档中设置单个字段,请使用 sponsors.$.fieldname

如果字段名提前未知,您可以尝试动态构建更新文档。

updateDoc = {};
for (key in req.body)
{
   updateDoc["sponsors.$."+key] = req.body[key]
}

然后将 updateDoc 传递给 $set 而不是 req.body