如何在特定索引处替换列表中的元素

时间:2019-07-18 00:46:01

标签: javascript amazon-web-services amazon-dynamodb aws-sdk

阅读docs时,他们说我可以在列表中添加一个元素,但是我正在尝试,并且它一直在向文档添加新项,其键为arrayName[index],如下所示:

我正在尝试以下查询:

    await documentClient.transactWrite({
      TransactItems: [{
        Update: {
          TableName: recordsTable,
          Key: { id: selectedRec.id },
          UpdateExpression: 'SET #k1 = :v1',
          ExpressionAttributeNames: {
            '#k1': `occurrences[${idx}]`, // idx = 245
          },
          ExpressionAttributeValues: {
            ':v1': selectedOccurrence, // a map object
          },
        }
      }, {
         // another query irrelevant to problem
      }]
    }).promise();

这是本文档的结尾:

enter image description here

它应该替换245数组中索引occurrences中的对象,但改为在文档中添加了一个键为occurrences[245]的新映射。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您不能在ExpressionAttributeNames中包含下标。您只能指定属性名称。

有两种解决方法:

UpdateExpression: `SET #k1[${idx}] = :v1`,
ExpressionAttributeNames: { '#k1': 'occurrences' }

或:

UpdateExpression: `SET occurrences[${idx}] = :v1`

请注意,如果您的属性名称为reserved word,则第二种解决方案将不起作用。