You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DynamoDB ConditionalCheckFailedException:嵌套字段条件更新异常排查

DynamoDB条件检查失败排查:值符合条件却触发ConditionalCheckFailedException

现有DynamoDB条目

RequestId:'1234567890' // 分区键
LastScanDateTime: '2023-01-12T11:00:00.111Z'
SubjectUpdateCounter: {
  Maths: 1,
  English: 1
}

执行的更新请求

{
    "TableName": "EmpDetails",
    "Key": {
        "RequestId": {
            "S": "1234567890"
        }
    },
    "ConditionExpression": "(#subjectUpdateCounter > :subjectUpdateCounterLimit)",
    "UpdateExpression": "ADD #subjectUpdateCounter :dec  SET LastScanDateTime = :LastScanDateTime,",
    "ExpressionAttributeValues": {
        ":dec": {
            "N": "-1"
        },
        ":LastScanDateTime": {
            "S": "2023-02-13T18:14:52.143Z"
        },
        ":subjectUpdateCounterLimit": {
            "N": "0"
        }
    },
    "ReturnValues": "NONE",
    "ExpressionAttributeNames": {
        "#subjectUpdateCounter": "SubjectUpdateCounter.Maths"
    }
}

触发的错误信息

ConditionalCheckFailedException: The conditional request failed
  ....
  ....
  '$fault': 'client',
  '$metadata': {
    httpStatusCode: 400,
    requestId: '12345ygfsdfagagdf',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  __type: 'com.amazonaws.dynamodb.v20120810#ConditionalCheckFailedException'
}

问题

当前SubjectUpdateCounter.Maths的值为1,大于0,符合条件表达式要求,但请求仍触发异常,请问原因是什么?


问题原因分析

有两个关键问题导致了这个异常:

  1. UpdateExpression存在语法错误
    你的UpdateExpression末尾多了一个多余的逗号:SET LastScanDateTime = :LastScanDateTime,,这个语法错误会导致请求解析失败,进而触发客户端错误,表现为条件检查失败的异常。

  2. 嵌套属性的引用方式错误
    在ExpressionAttributeNames中,你把#subjectUpdateCounter映射为"SubjectUpdateCounter.Maths",但DynamoDB会将这个值视为单个完整的属性名,而非嵌套属性路径。也就是说,条件表达式实际在检查根级别是否存在名为SubjectUpdateCounter.Maths的属性,而不是SubjectUpdateCounter对象下的Maths字段。由于这个根属性不存在,条件判定不满足,最终触发ConditionalCheckFailedException。

修正后的请求示例

{
    "TableName": "EmpDetails",
    "Key": {
        "RequestId": {
            "S": "1234567890"
        }
    },
    "ConditionExpression": "(#parent.#maths > :subjectUpdateCounterLimit)",
    "UpdateExpression": "ADD #parent.#maths :dec SET LastScanDateTime = :LastScanDateTime",
    "ExpressionAttributeValues": {
        ":dec": {
            "N": "-1"
        },
        ":LastScanDateTime": {
            "S": "2023-02-13T18:14:52.143Z"
        },
        ":subjectUpdateCounterLimit": {
            "N": "0"
        }
    },
    "ReturnValues": "NONE",
    "ExpressionAttributeNames": {
        "#parent": "SubjectUpdateCounter",
        "#maths": "Maths"
    }
}

内容的提问来源于stack exchange,提问作者Krishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:40:37