PutItem 和 DynamoDB 使用列表/数组

mon*_*key 5 amazon-web-services amazon-dynamodb aws-sdk-nodejs

我正在努力实现我认为非常标准的东西,但我已经碰壁了。我有一堆数据要存储在 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');
        }
    });
Run Code Online (Sandbox Code Playgroud)

问题是我一生都无法弄清楚如何让列表部分起作用。我首先将其定义为:

var payloadArrayInt16=  new Uint16Array(dataArrayMaxIndex); 
Run Code Online (Sandbox Code Playgroud)

错误是:

"errorMessage": "ERROR: Dynamo failed: InvalidParameterType: Expected params.Item[payload].L to be an Array"
Run Code Online (Sandbox Code Playgroud)

然后我试过:

var payloadArrayInt16= [dataArrayMaxIndex];
Run Code Online (Sandbox Code Playgroud)

它通过了,但显然没有做我想要的......当我打印出参数时,它没有取出数组的内容。它看到:

"Temp":{"L":[null,null,null,null,null,null,null,null,null,null]}
Run Code Online (Sandbox Code Playgroud)

我正在拔头发。在任何地方都没有一个关于如何做到这一点的例子。有人可以让我摆脱痛苦吗?!

kol*_*odi 6

DynamoDB 数值数组表示如下:

"payload": {
    "L": [
      {
        "N": "1"
      },
      {
        "N": "2"
      },
      {
        "N": "3"
      }
    ]
  }
Run Code Online (Sandbox Code Playgroud)

现在,如果您的输入数组 payloadArrayInt16 是这样的:

[1,2,3]
Run Code Online (Sandbox Code Playgroud)

您必须将其转换为 dynamo db 格式:

payloadArrayInt16.map(x => { return { "N": x.toString() }});
Run Code Online (Sandbox Code Playgroud)

但是通过使用这个官方的 aws dymanodb js 库 ,您可以让您的生活变得更轻松,它处理原生 js 对象结构到 dynamo db 数据结构之间的所有转换,反之亦然。

此外,如果您使用AWS IoT Core,则可以直接将数据写入 dynamodb,无需任何 lambda。