使用列表/数组在DynamoDB中进行PutItem

7

我试图实现的是一个本以为很标准的功能,但是却遇到了障碍。我有大量的数据要存储在DynamoDB中。

    const putDataParams = {
        TableName: "sensorNodeData2",
        Item: {
            "deviceId":   {"S": event.deviceId}, 
            "timeStamp":   {"N": event.time},
            "rssi": {"S": event.rssi},
            "seq":  {"S": event.seqNum},
            "payload": {"L": payloadArrayInt16.map(x => x.N)}
        }
    };
    console.log('Data PutItem Params = ' + JSON.stringify(putDataParams));

    dynamodb.putItem(putDataParams, function(err, data) {
        if (err) {
            console.log(err);
            context.fail('ERROR: Dynamo failed: ' + err);
        }
        else {
            console.log(data);
            context.succeed('SUCCESS');
        }
    });

问题在于我无法想出如何让列表部分起作用。我首先将其定义为:
var payloadArrayInt16=  new Uint16Array(dataArrayMaxIndex); 

错误信息为:

"errorMessage": "ERROR: Dynamo failed: InvalidParameterType: Expected params.Item[payload].L to be an Array"

然后我尝试了:
var payloadArrayInt16= [dataArrayMaxIndex];

经过测试,代码可以正常运行,但显然没有达到我的预期...当我打印出参数时,它没有提取数组的内容。它看起来像是:

"Temp":{"L":[null,null,null,null,null,null,null,null,null,null]}

我头发都要被拉光了。在任何地方都找不到一个教如何做这个的例子。请问有人可以解救我吗?!
1个回答

10
DynamoDB 数值数组的表示方式如下所示:
"payload": {
    "L": [
      {
        "N": "1"
      },
      {
        "N": "2"
      },
      {
        "N": "3"
      }
    ]
  }

现在,如果您的输入数组payloadArrayInt16是这样的:
[1,2,3]

你需要将它转换为DynamoDB格式:
payloadArrayInt16.map(x => { return { "N": x.toString() }});

但是,您可以使用这个官方的AWS DynamoDB JS库来使生活更加轻松。 它处理原生JS对象结构与DynamoDB数据结构之间的所有转换,反之亦然。
此外,如果您正在使用AWS IoT Core,则可以直接将数据写入DynamoDB,无需使用任何Lambda函数。

太棒了,你说得一点没错。非常感谢! - monkey
你说得完全正确。DocumentClient 对于将项目放入数据库中非常有效。我没有使用它的原因是我无法让它在查询方面正常工作,有点放弃了...也许我会再试一下。 - monkey
DynamoDB数据表示及其{name -> value} AttributeValues:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html - cellepo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接