在 DynamoDB table 项目的列表类型属性中添加或删除条目
Add or remove an entry from a List type attribute in a DynamoDB table item
我有一个非常简单的class,有一个字符串类型的主键和列表类型的属性。我想写一个 API 用于在属性列表中添加和删除一个项目,并将更改保存回 DDB。
我能想到的最简单的解决方案是:
- 阅读列表(如果存在)
- 如果存在,从列表类型属性中删除或添加项目
- 将修改后的对象放回去
是否有 cleaner/simpler 方法通过 DynamoDB java API?
我刚刚通读了 UpdateItem API,其中讨论了删除集类型属性:
DELETE - Removes the attribute and its value, if no value is specified for DELETE. The data type of the specified value must match the existing value's data type.If a set of values is specified, then those values are subtracted from the old set. For example, if the attribute value was the set [a,b,c] and the DELETE action specifies [a,c], then the final attribute value is [b]. Specifying an empty set is an error.
接受的答案不正确,DynamoDB UpdateExpression documentation
中列出了正确的做法
您需要阅读列表,然后获取要删除的项目的索引,然后 运行 REMOVE list[index]
作为 UpdateExpression
您可以使用SET
运算符在属性列表中添加元素。但是为此,您必须先检索现有列表,然后在列表中追加新元素。假设您有一个名为 active_user
的属性,其中包含活动用户列表。
previous_list = "#a"
query = "SET %s = list_append(%s, :new_user)" % (previous_list, previous_list)
user_table.update_item(
Key={
# primary key
},
UpdateExpression=query,
ExpressionAttributeNames={
'#a': 'active_user',
},
ExpressionAttributeValues={
':new_user': new_user_model
}
)
您可以使用 REMOVE
运算符移除或删除列表中的元素。但是您必须找到元素的索引,因为 REMOVE
运算符会删除列表的给定索引。
#user_index is the position of the target user in the list
query = "REMOVE active_user[%d]" % (user_index)
user_table.update_item(
Key={
# primary key
},
UpdateExpression=query
)
对于使用 PynamoDB 的用户,您可以:
从 ListAttribute(列表)中删除:
obj = Model.get(model_id)
index = obj.list.index(value)
obj.update(
actions=[
Model.list[index].remove()
]
)
附加到 ListAttribute(列表):
obj = Model.get(model_id)
obj.update(actions=[
Model.list.set(
Model.list.append([value])
)]
)
我有一个非常简单的class,有一个字符串类型的主键和列表类型的属性。我想写一个 API 用于在属性列表中添加和删除一个项目,并将更改保存回 DDB。
我能想到的最简单的解决方案是:
- 阅读列表(如果存在)
- 如果存在,从列表类型属性中删除或添加项目
- 将修改后的对象放回去
是否有 cleaner/simpler 方法通过 DynamoDB java API?
我刚刚通读了 UpdateItem API,其中讨论了删除集类型属性:
DELETE - Removes the attribute and its value, if no value is specified for DELETE. The data type of the specified value must match the existing value's data type.If a set of values is specified, then those values are subtracted from the old set. For example, if the attribute value was the set [a,b,c] and the DELETE action specifies [a,c], then the final attribute value is [b]. Specifying an empty set is an error.
接受的答案不正确,DynamoDB UpdateExpression documentation
中列出了正确的做法您需要阅读列表,然后获取要删除的项目的索引,然后 运行 REMOVE list[index]
作为 UpdateExpression
您可以使用SET
运算符在属性列表中添加元素。但是为此,您必须先检索现有列表,然后在列表中追加新元素。假设您有一个名为 active_user
的属性,其中包含活动用户列表。
previous_list = "#a"
query = "SET %s = list_append(%s, :new_user)" % (previous_list, previous_list)
user_table.update_item(
Key={
# primary key
},
UpdateExpression=query,
ExpressionAttributeNames={
'#a': 'active_user',
},
ExpressionAttributeValues={
':new_user': new_user_model
}
)
您可以使用 REMOVE
运算符移除或删除列表中的元素。但是您必须找到元素的索引,因为 REMOVE
运算符会删除列表的给定索引。
#user_index is the position of the target user in the list
query = "REMOVE active_user[%d]" % (user_index)
user_table.update_item(
Key={
# primary key
},
UpdateExpression=query
)
对于使用 PynamoDB 的用户,您可以:
从 ListAttribute(列表)中删除:
obj = Model.get(model_id)
index = obj.list.index(value)
obj.update(
actions=[
Model.list[index].remove()
]
)
附加到 ListAttribute(列表):
obj = Model.get(model_id)
obj.update(actions=[
Model.list.set(
Model.list.append([value])
)]
)