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,符合条件表达式要求,但请求仍触发异常,请问原因是什么?
问题原因分析
有两个关键问题导致了这个异常:
UpdateExpression存在语法错误
你的UpdateExpression末尾多了一个多余的逗号:SET LastScanDateTime = :LastScanDateTime,,这个语法错误会导致请求解析失败,进而触发客户端错误,表现为条件检查失败的异常。嵌套属性的引用方式错误
在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
相关产品推荐
相关产品推荐

