DynamoDB — PutItem — карта с вложенными типами данных (NodeJS, aws-sdk)

#node.js #amazon-dynamodb #aws-sdk

#node.js #amazon-dynamodb #aws-sdk

Вопрос:

Все — я работаю над конкретным бизнес-требованием, и из-за отсутствия информации в Google я подумал, что остановлюсь здесь для получения некоторой информации:

Я в основном принимаю CSV, преобразую его в объект JSON и загружаю его в Dynamo. Интересная часть заключается в том, что типы данных значений строк переходят между строками и числами, но я не могу заставить это работать должным образом.

Я использую Node и aws-sdk и буквально использовал документы Amazon, чтобы протестировать это напрямую, и это все равно не сработало, см. Ниже:

 var params = {
    TableName: foo,
    Item: {
        masterReportsUuid: uuidv4(),
        reportDate: _eventDate,
        "testAttribute": {
            "Name": {
                "S": "Joe"
            },
            "Age": {
                "N": "35"
            }
        },
    }
};



dbDocClient.put(params, (err, data) => {
    if (err) {
        //log to CloudWatch
        console.log(err);
        reject(err);
    } else {
        resolve(data);
    }
});
  

Очевидно, что TestAttribute представляет собой карту с именем и возрастом, строкой и номером. Это прямо из документации —

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#putItem-property

Атрибут типа Map. Например:

«M»: {«Name»: {«S»: «Joe»}, «Age»: {«N»: «35»}}

Но в Dynamo это выводится следующим образом —

Динамический вывод

Итак, мой вопрос — почему это не работает?

РЕДАКТИРОВАТЬ: опечатки.

Ответ №1:

Тьфу — я исправил проблему. Я оставлю это здесь на случай, если кто-нибудь столкнется с этим.

Две проблемы — я использовал вызов API DynamoDB.DoucmentClient().put, а не вызов DynamoDB.PutItem, И мой объект params был близок, но не корректен. Пожалуйста, смотрите ниже рабочий пример вложенных типов атрибутов карты —

 const dbDocClient = new aws.DynamoDB.DocumentClient();
const dbDynamo = new aws.DynamoDB();

var params = {
    TableName: _ReportsTable,
    Item: {
        testUuid: {
            "S": uuidv4()
        },
        testDate: {
            "S": _eventDate
        },
        testAttribute: {
            "M": {
                "Name": {
                    "S": "Joe"
                },
                "Age": {
                    "N": "35"
                }
            }
        },
    }
};


dbDynamo.putItem(params, (err, data) => {
    if (err) {
        //log to CloudWatch
        console.log(err);
        reject(err);
    } else {
        resolve(data);
    }
});