嵌套对象的DynamoDB条件更新表达式

2024-05-18 21:42:09 发布

您现在位置:Python中文网/ 问答频道 /正文

案例:

我知道这个问题有点长(抱歉)。我认为详细的描述能更好地解释我的情况。 我从流式处理端点接收设备数据。流中的每个有效负载包括多个数据实体。我创建了以下结构来存储在dynamo中

db_pk = str(msg.get('key'))
db_sk = str(msg.get('sortKey'))
area_id = str(msg.get('area'))
## other entities in following mapped_values...

mapped_values = {
    startTime: {
        'alert_msg': alert,
        'area ': area_id,
        'speed': speed,
        'state': state,
        'startTime': startTime,
        'duration': duration,
        'inspector': inspector_id
    }
}
# Data item
lt_item = {
    'id': db_pk,
    'serialNo': db_sk,
    'value_map': [mapped_values]
}

我使用下面的update语句创建每个有效负载中传入数据的映射。在

^{pr2}$

当前结果

上面的update表达式在dynamo中的value_map键下创建一个消息映射,每当收到新消息时,它将按如下方式附加到映射中:

{
   "id": "KD_125",
   "serialNo": "KDCRT-231"
   "value_map": [
      {
         "2019-05-29 14:36:03": { #first msg in payload
             "alert_msg": "0x12 LOGICAL ERROR AT DIRECTION SELECT SIGNAL",
             "area": "TX-112",
             "speed": "65",
             "startTime": "2019-05-29 14:36:03",
             "state": "ACTIVE",
             "duration": "None"
             "inspector": "None"
             }
      },
      {
        "2019-05-29 14:36:03": { # second msg, same timestamp with first one
             "alert_msg": "0x12 LOGICAL ERROR AT DIRECTION SELECT SIGNAL",
             "area": "None",
             "speed": "None",
             "startTime": "2019-05-29 14:36:03",
             "state": "PASSIVE",
             "duration": "1200"
             "inspector" "422TX19"
             }
        }
          #another message with different timestamp and data values
     ]
}

问题和要求

有些消息是用相同的时间戳(startTime)发送的。如果state='ACTIVE'在消息中,它包括除durationinspector之外的所有数据;如果state='PASSIVE',则包括{}和除areaspeed之外的其他数据(见上面的示例)。在

如果在有效负载中发送了相同的timestamp,我需要用'PASSIVE'状态消息的None值(duration和{})和{},而不是用相同的'PASSIVE'创建两个对象。所以最终的形状应该是:

{
   "id": "KD_125",
   "serialNo": "KDCRT-231"
   "value_map": [
      {
         "2019-05-29 14:36:03": { 
             "alert_msg": "0x12 LOGICAL ERROR AT DIRECTION SELECT SIGNAL",
             "area": "TX-112",
             "speed": "65",
             "startTime": "2019-05-29 14:36:03",
             "state": "PASSIVE", # updated from PASSIVE state msg
             "duration": "1200" # updated values from PASSIVE state msg
             "inspector": "422TX19" # updated values from PASSIVE state msg
             }
      }
      # other messages with different timestamps
   ]
}

我尝试了不同的update expressions,例如if_not_exists。另外,用

ExpressionAttributeNames = {
            '#value_map': 'value_map.startTime'
        }

选项。。但到目前为止还没有成功。我希望有人能给我建议一种方法来更新。。在


Tags: 数据id消息mapinspectorvaluemsgarea

热门问题