DynamoDB 更新操作中的 ConditionExpression 给出未知错误

ConditionExpression in DynamoDB update operation gives unknown error

我 运行 通过 DynamoDB 中的很多项目 table 如果项目包含某个字段(它是一个对象),我想在该对象上设置一些属性在那个领域。

我已经尝试了两种代码变体,但它们都给了我以下未指定的错误

{
    "errorType": "ConditionalCheckFailedException",
    "errorMessage": "The conditional request failed",
    "code": "ConditionalCheckFailedException",
    "message": "The conditional request failed",
    "time": "2020-08-29T11:44:11.703Z",
    "requestId": "IAN8A31FN2F1HR0ORT1RMTH5ENVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 26.45456917481479,
    "stack": [
        "ConditionalCheckFailedException: The conditional request failed",
        "    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:51:27)",
        "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
        "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
        "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)",
        "    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
        "    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
        "    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10",
        "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
        "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12)",
        "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"
    ]
}

这是具有命名属性的代码


          const itemParams = {
            TableName: process.env.vehiclesTableName,
            Key: { vehicleId },
            UpdateExpression:
              'set #learned.#versionId = :versionId, #learned.#fileFormat = :fileFormat',
            ExpressionAttributeValues: {
              ':versionId': VersionId,
              ':fileFormat': fileFormat,
            },
            ConditionExpression: 'attribute_exists(#learned)',
            ExpressionAttributeNames: {
              '#learned': 'learned',
              '#versionId': 'versionId',
              '#fileFormat': 'fileFormat',
            },
          }
          await db.update(itemParams).promise()



并且没有命名属性

          const itemParams = {
            TableName: process.env.vehiclesTableName,
            Key: { vehicleId },
            UpdateExpression:
              'set learned.versionId = :versionId, learned.fileFormat = :fileFormat',
            ExpressionAttributeValues: {
              ':versionId': VersionId,
              ':fileFormat': fileFormat,
            },
            ConditionExpression: 'attribute_exists(learned)',
          }
          await db.update(itemParams).promise()

它们的行为相同。

您看到的异常实际上是预期的行为,表明条件未计算为真。来自 documentation:

ConditionalCheckFailedException

Message: The conditional request failed.

You specified a condition that evaluated to false. For example, you might have tried to perform a conditional update on an item, but the actual value of the attribute did not match the expected value in the condition.

当您遇到 ConditionalCheckFailedException 异常时,您显然是在尝试更新没有 learned 属性的项目。