使用节点js的地图中列表中特定索引处的Dynamodb sdk更新条目

Posted

技术标签:

【中文标题】使用节点js的地图中列表中特定索引处的Dynamodb sdk更新条目【英文标题】:Dynamodb sdk update entry at specific index in list in a map using node js 【发布时间】:2022-01-22 20:51:02 【问题描述】:

我正在尝试使用计数器更新特定列表条目。

 const taskParams = 
        TableName: CONST.NAMES.SUJET_TABLE_NAME,
        Key: 
            id: defectId
        ,
        UpdateExpression: "SET #list.#epicType.#tasks[#taskIndex].#tracking =:attrValue ",
        ExpressionAttributeNames: 
            '#list': 'epicsList',
            '#tasks': 'tasks',
            '#epicType': epicType,
            '#taskIndex': taskCounter,
            '#tracking': 'tracking',

        ,
        ExpressionAttributeValues: 
            ':attrValue': epicData["tasks"][0]["tracking"],
        ,
    ;

    try 
        await documentClient.update(taskParams).promise();
        console.log("Task successfully created.")

     catch (err) 
        console.log("Unable to create Task ", err);
    

执行时出现以下错误:

ValidationException: Invalid UpdateExpression: Syntax error; token: "#taskIndex", near: "[#taskIndex]"

是语法错误还是有什么我不知道的地方?

【问题讨论】:

另一种选择,虽然我不知道你的访问模式,是对你的数据进行不同的建模。您可以在作为连接键的每个项目上使用排序键,并在查询时使用 begin_with() 表达式。所以你有一个排序键,比如 epic::DEV::tasks 等等。我这样说是因为我可以预见这些文档会变得非常大,如果您将它们分解,您将只更新您需要的数据片段。当您需要所有数据时,您仍然可以执行 begin_with("epic::DEV") 并获得该缺陷的所有项目。 感谢您的建议。我同意数据模型既不优化也不理想。不幸的是,架构是由其他人设置的,我唯一的工作是实现后端功能。 【参考方案1】:

我终于找到了答案,对于那些遇到这个问题的人:

 const taskParams = 
        TableName: CONST.NAMES.SUJET_TABLE_NAME,
        Key: 
            id: defectId
        ,
        UpdateExpression: "SET #list.#epicType.#tasks[" + taskIndex+ "].#tracking =:attrValue ",
        ExpressionAttributeNames: 
            '#list': 'epicsList',
            '#tasks': 'tasks',
            '#epicType': epicType,
            '#tracking': 'tracking',

        ,
        ExpressionAttributeValues: 
            ':attrValue': epicData["tasks"][0]["tracking"],
        ,
    ;

【讨论】:

以上是关于使用节点js的地图中列表中特定索引处的Dynamodb sdk更新条目的主要内容,如果未能解决你的问题,请参考以下文章

从特定索引处的列表中检索值

如何将特定索引处的列表数据发送到颤动中另一个列表的特定索引

扫描Dynamo DB中的特定行

如何从python列表中任何特定索引处的句子中提取特定字符串?

从现有列表中特定索引处的元素创建新列表

如何替换python列表特定索引处的值?