Amazon dynamodb 如何在dynamodb中添加空映射或数据映射?
我有这样的想法:Amazon dynamodb 如何在dynamodb中添加空映射或数据映射?,amazon-dynamodb,Amazon Dynamodb,我有这样的想法: { Records:{} } { Id: 123, Records:{ 10001: { event : "item1" } } } 我只想在记录中添加如下数据: { Records:{} } { Id: 123, Records:{ 10001: { event : "item1" } } } 我的第一次尝试: var params = { TableName : "Records", Key : { I
{
Records:{}
}
{
Id: 123,
Records:{
10001: { event : "item1" }
}
}
我只想在记录中添加如下数据:
{
Records:{}
}
{
Id: 123,
Records:{
10001: { event : "item1" }
}
}
我的第一次尝试:
var params = {
TableName : "Records",
Key : { Id : 123 },
UpdateExpression: 'set Record.#k1.event = :v1',
ExpressionAttributeNames: { '#k1' : 10001},
ExpressionAttributeValues: { ':v1' : 'item1' }
};
因为Record.10001不存在,它会给我错误:
The document path provided in the update expression is invalid for update
“添加”仅支持编号和设置类型,因此不适合我的情况
我的第二次尝试(第一次尝试创建空地图):
它失败了,因为我的语法可能不正确,并且我找不到如何创建属性的空映射
因此,我的问题是如何将结构化对象作为映射或空映射添加到现有项,如上面的示例所示
我可以很容易地从amazon DynamoDB数据管理页面修改数据,所以至少我知道有一种方法可以做到这一点。我只是想知道怎么做
谢谢我以某种方式成功地做到了这一点:
var params = {
TableName: "Records",
Key: { Id: 123 },
UpdateExpression: 'set Records.#k1 = :v1',
ExpressionAttributeNames: {'#k1': '10001',},
ExpressionAttributeValues: {':v1': { event: 'Yay~' } }
};
您可以选择使用
UpdateExpression: 'set Records.#k1 = if_not_exists( Records.#k1, :v1)',
以避免覆盖现有记录。我找到了一个解决方法来解决我们遇到的错误
try:
table.update_item(
Key = {'Id' : id},
UpdateExpression = 'SET Records.#key1.#key2 = :value1',
ExpressionAttributeNames = {'#key1': '10001', '#key2' : 'event'},
ExpressionAttributeValues = {':value1': 'singing'}
)
except:
table.update_item(
Key = {'Id' : id},
UpdateExpression = 'SET Records = :value1',
ExpressionAttributeValues = {':value1': {'10001': {'event' : 'dance'}}}
)
当我们第一次尝试更新时,会出现“更新表达式中提供的文档路径对于更新无效”错误。由于没有嵌套的JSON,将引发异常
此后,任何更新(例如Record.10002)都不会引发异常。将执行try块中的Update函数
如果这是处理此类场景的正确方法,请对此进行评论。解决此问题的可能方法之一:必须提前在DB中创建并存在一个空对象 比如说,
TableName: ....,
Key: {
.....
},
UpdateExpression: 'set field.#mapKey = :v',
ExpressionAttributeNames: {
'#mapKey': myName
},
ExpressionAttributeValues: {
':v': myValue
}
为了基于给定的具有各种键的字典(最终是Dynamodb中的列),动态插入/更新Dynamodb项,我们可以构造查询字符串,如下所示:
# given dictionary with needs to be dumped into dynamodb
dict_to_insert = {'column1':'value1',
'column2.subdocument1':{'subkey1':'subvalue1',
'subkey2':'subvalue2'}...}...
# placeholder variables
# Using upsert for insert/update mllog records on dynamodb
query = "SET"
values_dict = {}
names_dict = {}
i = 0
# iterating over given dictionary and construct the query
for key, value in dict_to_insert.items():
# if item key column provide in the given dictionary
# then it should be skipped
if key == 'ITEM_KEY_NAME':
i += 1
continue
# None values causing error on update_item
# So, better to ignore them as well
if value is not None:
# if_not_exists method prevents overwriting existing
# values on columns
query += " " + "#k_" + str(i) + " = if_not_exists(#k_" + str(i) + \
", :v_" + str(i)+")"
if key != list(dict_to_insert.keys())[-1]: # if not the last attribute add ,
query += ","
# Defining dynamodb columns and their corresponding values
values_dict["#k_" + str(i)] = key
names_dict[":v_" + str(i)] = value
i += 1
如上图所示构造查询字符串后,我们就可以放心地在Dynamodb上运行update_item方法:
# table obj here is boto3 dynamodb resource instance
table.update_item(
TableName='DYNAMODB_TABLENAME',
Key={'ITEM_KEY_NAME': 'ANY_VALUE_AS_KEY'},
UpdateExpression=query.strip(),
ExpressionAttributeNames=names_dict,
ExpressionAttributeValues=values_dict)
在没有特定异常的情况下使用
except
是不好的做法。你可能最终会吞下你不想犯的错误。这里最好只捕获ClientError
异常。谢谢,这解决了我的问题。如果不存在,我们可以嵌套?例如如果不存在(如果不存在(路径,:值),:值)