我有类似的情况,我有主要类别,例如:
{
"service": {
"isReviewed": false,
"_id": "5ea36b27d7ae560845afb88d",
"mainCategory": "message ",
"SubCategory": [
{
"priceChanged": true,
"_id": "5ea36b27d7ae560845afb88e",
"subCatPrice": "26",
"subCatName": "mustach trimming"
}
],
"shopName": "paddy the barber",
"user": "5ea1fd5b69512dc72ad2f48c",
"date_created": "2020-04-24T22:41:43.368Z",
"__v": 5
}
}
现在,花了一段时间才弄清楚如何更新子文档的一部分。因为子文档存储为对象。
所以所有 id,首先我在文档通过 put/:id 时检查文档的 _id。然后,我根据 req.user 检查了 doc 的所有者。
如果一切正常,我遍历数组然后生成一个新对象。然后,我所做的就是检查每个 req.body 的价格或名称,如果有新价格,我会更新对象中的价格值。如果有新值,则对象保持不变。
然后就是我所说的,service.SubCategory = newObject 并存储数据。
它工作正常,但是,我遇到了 subdoc _id 得到更新的问题,所以我通过保持旧值作为它来解决这个问题。
现在,在性能和优化方面,我不完全确定这是否是正确的方法,但它的工作原理,如果它们更好,我愿意改变。
这是代码:
const newObject = {
subCatPrice: "",
subCatName: "",
_id: "",
priceChanged: false
};
let oldDetails = service.SubCategory;
for (const old of oldDetails) {
newObject.subCatPrice = old.subCatPrice;
newObject.subCatName = old.subCatName;
newObject._id = old._id;
}
price ? (newObject.subCatPrice = price ) && (newObject.priceChanged = true) : newObject.subCatPrice;
name ? (newObject.subCatName = name) : newObject.subCatName;
(service.SubCategory = newObject), await service.save();
老实说,我使用了状态的反应思想,我只是获取对象的副本并保留它并将更新应用于我想要更新的部分。
再次就干净的代码和所有这些东西而言,我不确定这是否是正确的方法,但我也是编程的学生,我也想学习。
希望这对某人有帮助