Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb 如何在dynamodb中添加空映射或数据映射?_Amazon Dynamodb - Fatal编程技术网

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中创建并存在一个空对象

比如说,

  • 生成对象期间(原始创建,以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
    异常。谢谢,这解决了我的问题。如果不存在
    ,我们可以嵌套
    ?例如
    如果不存在(如果不存在(路径,:值),:值)