如何使用文档客户端修改dynamodb中嵌入式列表中的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用文档客户端修改dynamodb中嵌入式列表中的元素相关的知识,希望对你有一定的参考价值。

我有一个DynamoDB表,其中表中的每个项都有一个注释数组作为属性。我的架构看起来像这样:

{
  "id": "abc",
  "name": "This is an item"
  "comments": [
    "commentId": "abcdefg",
    "commentAuthor": "Alice",
    "commentDetails": "This item is my favourite!"
  ]
}

我希望能够通过其commentId编辑单个注释,但是不清楚如何为此更新编写DynamoDB表达式(我正在使用DocumentClient)。

我们如何在Dynamo中更新嵌入式阵列中的条目?是否可以通过数组索引或查询表达式进行更新?

答案

我认为应该对您的数据模型进行一些修改。您应该使用dynamodb map,只需将您的commentId作为访问每条评论的关键字

 {
  "id": "abc",
  "name": "This is an item"
  "comments": {
    "abcdefg":{
      "commentAuthor": "Alice",
      "commentDetails": "This item is my favourite!"
    }
  }
}

然后查询看起来像这样,你必须知道两件事来更新评论1是项目ID,2是评论ID

var params = {
  TableName: Tablename,
  Key: {id: "abc"},
  UpdateExpression:"set comments.#abcdefg.commentDetails=:val1",
  ExpressionAttributeNames: {
    "#abcdefg":"abcdefg"
  },
  ExpressionAttributeValues:{
    ":val1":"New comment text"
  }
}

 db.update(param,callback);

请让我知道并原谅我,解释你的问题,如果我误解,因为我没有足够的积分来澄清我的评论疑虑。

另一答案

就个人而言,我不会把我想要编辑或频繁访问的项目放在远离主键的位置。记住DynamoDB基本上是一个键值存储,所以每当你想访问东西时,最好通过主键暴露这些项目。

那么你能做些什么,在我看来,最好的方法是略微改变你的数据模型。所以我会创建一个包含主键ID和项类型排序键的表。在您的情况下,您现在将有两种项目类型,“项目”和“comment_ [commentID]”。每个注释都可以将作者和详细信息字段作为其属性,如下所示:

- [ID    - ITEMTYPE]         - NAME
- "abc"  - "item"            - "This is an item"
- [ID    - ITEMTYPE]         - AUTHOR  - DETAILS
- "abc"  - "comment_abcdefg" - "Alice" - "This item is my favourite!"

现在,如果您想获取项目的所有注释,只需查询项目ID,排序键以“注释”开头。如果您想编辑评论,您可以通过将该ID添加到排序键来获得此项目,这将导致完全匹配。 (这也非常快)。您可以通过多种方式使其更加灵活,但这应该足以满足您的要求。

很抱歉,我只是读了你对其他答案的评论,当然,你可以在评论和项目类型sortkey中的ID字段之间添加一个排序编号,这样评论会按顺序自动排序(或者反向偏离课程) 。

另一答案

是否可以通过数组索引更新...?

是的,如果你知道索引,它就是easy。刚刚在我当地的localhost:8000/shell/为我工作。我假设comments列表中的每个注释元素都是一个对象,并且您忘记了示例中注释属性周围的括号{}。如果我误解或者您的需求有更多,请告诉我。

var params = {
    TableName: 'table_name',
    Key: { // The primary key of the item (a map of attribute name to AttributeValue)

        id: 'abc', //(string | number | boolean | null | Binary)
        // more attributes...
    },
    UpdateExpression: 'SET comments[1] = :value', // String representation of the update to an attribute
        // SET set-action , ... 
        // REMOVE remove-action , ...  (for document support)
        // ADD add-action , ... 
        // DELETE delete-action , ...  (previous DELETE equivalent)
    ExpressionAttributeValues: { // a map of substitutions for all attribute values
        ':value': {
            commentId: 'abcdefg1',
            commentAuthor: 'Alice',
            commentDetails: 'changed'
         }
    },
    ReturnValues: 'NONE', // optional (NONE | ALL_OLD | UPDATED_OLD | ALL_NEW | UPDATED_NEW)
    ReturnConsumedCapacity: 'NONE', // optional (NONE | TOTAL | INDEXES)
    ReturnItemCollectionMetrics: 'NONE', // optional (NONE | SIZE)
};
docClient.update(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});

Output:

enter image description here

以上是关于如何使用文档客户端修改dynamodb中嵌入式列表中的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何设计 DynamoDB 表以方便按时间范围搜索和按唯一 ID 删除

如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?

AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API

Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目

使用 Amplify 库的基于 DynamoDB GSI 的查询

使用 spring-data-dynamodb 在 GSI 中查询 dynamoDB 中的 id 列表