PutItem с DynamoDB с использованием списков/массивов

Я пытаюсь добиться чего-то, что, как я полагал, будет довольно стандартным, но я наткнулся на стену. Мне приходит куча данных, которые я хочу сохранить в 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]}

Я выдергиваю волосы. Нигде нет ни одного примера того, как это сделать. Кто-нибудь может избавить меня от страданий?!


person monkey    schedule 07.11.2018    source источник


Ответы (1)


Массив числовых значений DynamoDB представлен следующим образом:

"payload": {
    "L": [
      {
        "N": "1"
      },
      {
        "N": "2"
      },
      {
        "N": "3"
      }
    ]
  }

Теперь, если ваш входной массив payloadArrayInt16 выглядит так:

[1,2,3]

Вы должны преобразовать его в формат Dynamo DB:

payloadArrayInt16.map(x => { return { "N": x.toString() }});

Но вы можете значительно облегчить себе жизнь, используя официальный aws dymanodb js библиотека Обрабатывает все преобразования между собственными объектными структурами js в структуры данных Dynamo db и наоборот.

Также, если вы используете AWS IoT Core вы можете напрямую записывать данные в DynaModb без каких-либо лямбда-выражений.

person kolodi    schedule 07.11.2018
comment
Крошки. Вы попали в самую точку. Огромное спасибо! - person monkey; 07.11.2018
comment
И вы совершенно правы. DocumentClient отлично работал для помещения элементов в базу данных. Причина, по которой я не использовал его, заключалась в том, что я не мог заставить его работать для запросов и как бы разочаровался в нем... Может быть, я дам ему еще один вихрь. - person monkey; 07.11.2018
comment
Представление данных DynamoDB с его {имя -> значение} AttributeValues: docs.aws .amazon.com/amazondynamodb/latest/APIReference/ - person cellepo; 16.01.2020