我有一个DynamoDB表,表中的每个项都有一个注释数组作为属性。我的模式如下所示:
{
"id": "abc",
"name": "This is an item"
"comments": [
"commentId": "abcdefg",
"commentAuthor": "Alice",
"commentDetails": "This item is my favourite!"
]
}
我希望能够通过它的注释Id
编辑单个注释,但是不清楚如何为此更新编写DynamoDB表达式(我使用DocumentClient)。
我们如何在Dynamo中更新嵌入式数组中的条目?是否可以通过数组索引或查询表达式进行更新?
是否可以通过数组索引更新...?
是的,如果你知道索引,这很容易。这在我的本地localhost:8000/shell/
中很管用。我假设comments
列表中的每个comment元素都是一个对象,并且您忘记了示例中comment属性周围的括号{}
。如果我误解了你,或者你还有其他需要,请告诉我。
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
});
就个人而言,我不会把我想要编辑或访问的项目频繁地放在离主键这么远的地方。记住DynamoDB基本上是一个键值存储,所以每当你想访问东西时,最好是通过主键公开这些项目。
所以在我看来,你能做些什么呢?最好的方法是稍微改变一下你的数据模型。因此,我将创建一个带有主键ID和项类型的排序键的表。在您的例子中,现在有两种项目类型,“item”和“comment_[commentID]”。每个评论都可以将作者和详细信息字段作为其属性,如下所示:
- [ID - ITEMTYPE] - NAME
- "abc" - "item" - "This is an item"
- [ID - ITEMTYPE] - AUTHOR - DETAILS
- "abc" - "comment_abcdefg" - "Alice" - "This item is my favourite!"
现在,如果你想得到一个项目的所有评论,你只需用排序键从“评论”开始查询项目标识。如果你想编辑评论,你可以简单地通过将标识添加到排序键来得到这个项目,这将导致完全匹配。(这也会非常快)。有几种方法可以让这变得更加灵活,但这应该足以满足你的要求。
很抱歉,我刚刚读了你对另一个答案的评论,当然,你可以在评论和条目类型sortkey中的ID字段之间添加一个排序号,这样评论会自动按该顺序排序(或反向)。
我认为你的数据模型应该做些修改。你应该使用dynamodb map来实现这一点,只需将你的commentId作为访问每条评论的键即可
{
"id": "abc",
"name": "This is an item"
"comments": {
"abcdefg":{
"commentAuthor": "Alice",
"commentDetails": "This item is my favourite!"
}
}
}
然后查询会是这样的,您必须知道两件事来更新注释1是Item id,2是comment 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);
请让我知道,并原谅我,解释你的问题,如果我误解了,因为我没有足够的点来澄清我的疑问在评论中。
本文向大家介绍Python 修改列表中的元素方法,包括了Python 修改列表中的元素方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Python 修改列表中的元素方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
问题内容: 我创建了一个表格,并意外地将length 改为。我该如何解决? 一个例子将不胜感激。 问题答案: 你有尝试过吗? 这会将 col_name 的类型更改为
DynamoDB JavaScript DocumentClient cheat sheet The DynamoDB Document Client is the easiest and most preferred way to interact with a DynamoDB database from a Nodejs or JavaScript application. This che
问题内容: 在Python中遍历列表时,如果没有列表理解,就无法修改元素。以供参考: 那么,为什么不能通过Python中的循环修改元素?肯定有一些我想念的东西,但是我不知道是什么。我确定这是重复的,但是我找不到与此相关的问题,如果有链接,那就绰绰有余了。 问题答案: 因为工作方式是这样的: 所以如果你给i它分配任何东西都不会影响。 解决方案是您所建议的,或者遍历索引: 或使用:
我将dataframe的列索引分配给对象。 我只是希望第二个元素(列)名称是“Fred”。
问题内容: 没有使用foreach循环就可以针对以下问题定义LINQ语句吗? 在写这个问题时,我找到了解决问题的办法。我仍然会发布(并回答)这个问题,因为这个问题对我来说真是个麻烦。而且我在这里没有找到合适的现有问题。 乔,尤文 问题答案: 相信and可以解决这个问题! 第二个变量名称具有误导作用。除其他字母外,它还会返回的一个实例,该实例在原始集合中 不是 唯一的;)