使用节点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更新条目的主要内容,如果未能解决你的问题,请参考以下文章