json - 嵌套对象的 FindOneAndUpdate
问题描述
我正在尝试更新 JSON 的嵌套对象。我可以编辑该字段,但我无法将我的位置运算符集成为变量。
这就是我的 JSON 的样子:
{
"id": "3",
"name": "Deployment",
"frequency": "15",
"lastExecuted": "05.05.2018",
"maintenanceSteps": {
"maintenanceStep": [
{
"id": "1",
"shortDescription": "ShortDescription",
"description": "TestDescription",
"video": "6.1.mp4",
"image": "LinkToImage",
"status": "open",
"duration": "25"
},
{
"id": "2",
"shortDescription": "ShortDescription",
"description": "TestDescription",
"video": "6.1.mp4",
"image": "LinkToImage",
"status": "open",
"duration": "15"
}
]
}
}
这就是我尝试设置状态的方式:
resolve: async function (root, param) {
let setMaintenanceStepStatus = {};
if (param.status) {
if(setMaintenanceStepStatus["maintenanceSteps"])
{
console.log("true");
setMaintenanceStepStatus.maintenanceSteps.maintenanceStep[param.id-1].status = param.status;
}
console.log("STEP: " + setMaintenanceStepStatus);
}
const uMaintenanceStep = await MaintenancePlanModel.findOneAndUpdate({name: param.name},
{ $set:
{
"maintenanceSteps.maintenanceStep.1.status": param.status,
}
}, {
new: true
});
console.log("MSTEP: " + uMaintenanceStep.maintenanceSteps.maintenanceStep[param.id-1])
//uMaintenanceStep.maintenanceSteps.maintenanceStep[param.id-1].status = param.status;
if (!uMaintenanceStep) {
throw new Error('Error')
}
return uMaintenanceStep
}
问题在于这一行中的位置运算符:
"maintenanceSteps.maintenanceStep.1.status": param.status
我如何在其中获取我的 param.id?
使用
"maintenanceSteps.maintenanceStep." + param.id + ".status": param.status
不幸的是不起作用
另一种想法是更改 findOneAndUpdate,这样我就可以直接访问要更新的维护步骤。
我试过这个:
const uMaintenanceStep = await MaintenancePlanModel.findOneAndUpdate({name: param.name, "maintenanceSteps.maintenanceStep.id": param.id},
但我收到此错误消息:“无法读取 null 的属性 'maintenanceSteps'”。
我的另一个想法是使用 findById 并通过其 objectID 搜索 maintenanceStep,因此我不必访问任何嵌套对象。但在这里我得到一个转换错误“Cast to ObjectId failed for value \"{ id: '5d63f6e37276ee1b4cdb99c5' }\" at path \"_id\" for model \"maintenanceStep\"
解决方案
问题的答案是,如果要传递连接的字符串,则需要将其作为数组传递:
所以解决方案是:
["maintenanceSteps.maintenanceStep." + [param.id-1] + ".status"]
这是完整的代码:
resolve: async function (root, param) {
let setMaintenanceStepStatus = {};
let one = "maintenanceSteps.maintenanceStep." + [param.id-1] + ".status"
if (param.status) {
if(setMaintenanceStepStatus["maintenanceSteps"])
{
console.log("true");
setMaintenanceStepStatus.maintenanceSteps.maintenanceStep[param.id-1].status = param.status;
}
console.log("STEP: " + setMaintenanceStepStatus);
}
const uMaintenanceStep = await MaintenancePlanModel.findOneAndUpdate({name: param.name, "maintenanceSteps.maintenanceStep.id": param.id},
{ $set:
{
[one]: param.status,
}
}, {
new: true
});
console.log("MSTEP: " + uMaintenanceStep.maintenanceSteps.maintenanceStep[param.id-1])
//uMaintenanceStep.maintenanceSteps.maintenanceStep[param.id-1].status = param.status;
if (!uMaintenanceStep) {
throw new Error('Error')
}
return uMaintenanceStep
}
},
推荐阅读
- google-chrome-extension - 如果我更新我的扩展而不增加清单中的版本会发生什么?
- python - 如何更改直方图中的 GROUPBY 顺序?
- css-animations - 特定动画名称的 addEventListener
- mysql - MySQL 通过名字和姓氏的组合搜索
- html - 悬停时翻译 css 时按钮文本模糊
- node.js - 智能合约:.methods.request().send() 不显示任何内容
- elasticsearch - Elasticsearch Kubernetes pod - 无法连接到端口 9300
- javascript - ReferenceError: $ is not defined - 它曾经工作正常,但现在它坏了 - Rails 5
- javascript - 如何防止在可放置 div 之外拖动(移动)元素?(仅限 Vanila JS)
- python - 如何在 Python 中每 2 秒调用一次函数?