【问题标题】:FindOneAndUpdate of a nested object嵌套对象的 FindOneAndUpdate
【发布时间】:2019-12-30 11:25:37
【问题描述】:

我正在尝试更新 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,这样我就可以直接访问要更新的 maintenanceStep。

我试过这个:

const uMaintenanceStep = await MaintenancePlanModel.findOneAndUpdate({name: param.name, "maintenanceSteps.maintenanceStep.id": param.id},

但我收到此错误消息:“无法读取属性 'maintenanceSteps' of null”。

我的另一个想法是使用 findById 并通过 objectID 搜索 maintenanceStep,因此我不必访问任何嵌套对象。但在这里我得到一个转换错误“Cast to ObjectId failed for value \"{ id: '5d63f6e37276ee1b4cdb99c5' }\" at path \"_id\" for model \"maintenanceStep\"

【问题讨论】:

    标签: json mongoose nested graphql


    【解决方案1】:

    问题的答案是,如果你想传递一个串联的字符串,你需要将它作为一个数组传递:

    所以解决办法是:

    ["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
          }
        },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2014-05-06
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多