【问题标题】:DynamoDB update with composite primary key with node sdkDynamoDB 使用带有节点 sdk 的复合主键进行更新
【发布时间】:2021-04-30 22:35:46
【问题描述】:

我希望在 dynamoDB javascript SDK 中使用文档客户端的更新功能部分。我的 dynamoDB 表有一个主分区键“PK”(字符串)和一个主排序键“SK”(字符串)。我的理解是这意味着我的项目需要用它们的复合主键来标识,它是“PK”和“SK”的某种组合

我正在使用单表设计,因此示例项目看起来像

PK“CONTEST#2021”

SK:“POST#5673”

作者:“USER#2759”

文本:“Lorem ipsum”

评论编号:9

我的代码逻辑是这样的

const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();

exports.addComment = async (event, context, callback) => {

const params = {
    TableName: 'App', 
    Key: {
        "PK": event.PK,
        "SK": event.SK
    },       
    UpdateExpression: 'set commentNumber = :number',
    ExpressionAttributeValues: {
        ':number': event.updatedCommentCount
    }
}

try {
    var res = await dynamo.update(params).promise()
    // handleSuccess(res)
} catch(err) {
    // handleFail(err)
}

return 'success'

};

当我尝试上面的代码时,我收到一条错误消息the provided key element does not match the schema

我知道我的参数中的 Key 键有问题,但文档没有帮助。它表明可以使用复合键进行更新,并且似乎表明 Key 的值可以是具有两个键的对象,但这不起作用。如何更新我的参数以使用更新功能?

【问题讨论】:

  • 此时我会仔细检查event.PKevent.SK 是字符串。我还听说过分区键和/或排序键配置错误、名称不匹配等情况。您可能需要仔细检查 AWS 控制台中 DynamoDB 表的概览选项卡。
  • 您找到解决方案了吗?我有同样的问题。
  • 很遗憾没有。我最终只是通过完全替换该行来解决这个问题

标签: javascript amazon-dynamodb


【解决方案1】:

我相信您必须在属性名称前使用#,如下所示:...UpdateExpression: 'set #commentNumber = :number',...

【讨论】:

  • 我重试了 ExpressionAttributeNames: { '#commentNumber' : 'commentNumber' }, UpdateExpression: 'set #commentNumber = :number' 得到了相同的结果
  • 能否请您将表中的示例元素(包括分区和排序键)添加到原始帖子中?分区键和排序键的数据类型是什么?
  • 好主意,刚刚添加了一个示例项目。 PK 和 SK 都需要字符串,我可以通过 console.logs 进行确认。如果您询问我的分区和排序键的数据类型,这是否意味着我的参数中的“键”结构看起来应该可以工作,而问题可能是其他问题?
猜你喜欢
  • 2013-12-19
  • 2017-12-13
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多