在对象数组中查找id并通过id更新内容

Find id in an array of objects and update content via id

我有一个包含多个对象的数组,我需要访问对象中的其中一个 ID,以便我可以更新 React 中的内容。目前,我在进行更新时没有看到状态发生变化。 当我的数据模式只是一个对象并且没有数组时,更新工作正常。现在我改变了我的数据结构,我不能再更新我的状态。下面是控制器。

举个例子,我想访问 id 2 来更新笔记状态。

我的问题:通过在对象中查找 ID 来更新对象的正确语法是什么?

  exports.updateCompany = async (req, res) => {
  let snapShotID = req.params.id;
  await findUpdateEmployee.findByIdAndUpdate(
    {
      _id: snapShotID,
      details: {
        $elemMatch: { id: req.params.detailsId) },
      },
    },
    {
      $set: { "details.$.notes": req.body.notes },
      new: true,
    },
    (err, data) => {
      if (err) {
        res.status(500).json({
          message: "update not created",
        });
      } else {
        res.status(200).json({
          success: true,
          message: "Post Updated",
          data,
        });
      }
    }
  );
};

这是模型:

{
    "message": "Post found",
    "data": {
        "company": "Riteaid",
        "_id": "1",
        "details": [
            {
                "employee": "jane doe",
                "balance": "3",
                "notes": "some notes",
                "_id": "2"
            },
            {
                "employee": "john doe",
                "balance": "1",
                "notes": "some more notes",
                "_id": "3"
            }
        ],
    }
}

使用 findByIdAndUpdate,默认情况下它 returns 更新后的原始文档,除非你用 { new: true} 指定它,所以

  await CompanySnapShotTest.findByIdAndUpdate(
    snapShotID ,
    { $set: req.body },
    { new: true},
    (err, data) => {
      if (err) {
        res.status(500).json({
          message: "update" + id + "not created",
        });
      } else {
        res.status(200).json({
          message: "Post Updated",
          data,
        });
      }
    }
  );

我需要做两件事,将 URL 路径从: someurl/:idsomeurl/:companyId/employeeId

第二个是将代码从 findByIdAndUpdate 编辑为 findOneAndUpdate,最后按照文档了解如何使用过滤器和更新构造代码。另外,我使用 $elemMatch 作为过滤器:

exports.updateSnapShotTest = async (req, res) => {
  await CompanySnapShotTest.findOneAndUpdate(
    {
      _id: req.params.companyId,
      details: { $elemMatch: { _id: req.params.employeeId } } }, // FILTER
    {
      $set: {
        "details.$.notes": req.body.notes, // UPDATE
      },
    },
    { new: true, safe: true, upsert: true },
    (err, data) => {...});
      }
    }
  );
};