在对象数组中查找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/:id
到 someurl/: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) => {...});
}
}
);
};
我有一个包含多个对象的数组,我需要访问对象中的其中一个 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/:id
到 someurl/: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) => {...});
}
}
);
};