web-dev-qa-db-fra.com

Comment insérer json dans dynamodb

Voici mon code.
Je veux insérer asset_data json dans asset_data colonne. j'utilise aws sdk. Il indique que aws sdk prend désormais en charge json. http://aws.Amazon.com/releasenotes/SDK/JavaScript/1691866671551861

var asset_data = {
    "name": "name" + i,
    "contentUrl": "http://www.hdwallpapersimages.com/nature-beauty-desktop-images/94892/",
    "size": 300,
    "headline": "headline",
    "description": "assetUrl reference for the creator",
    "encodingFormat": 'jpeg'
  };

  var params = {
    TableName: 'xyz',
    Item: { // a map of attribute name to AttributeValue
      "asset_id": {S: "asset" + i},
      "hit_id": {S: "0"},
      "created_date": {"S": Date.now().toString()},
      "status": {N: "0"},
      "operation": {S: "image_tagging"},
      "asset_data": {L: asset_data},
      "source": {S: "DAM"},
      "completed_date": {S: Date.now().toString()},
      "response_data": {S: "taged value"}
      // more attributes...
    },

    ReturnValues: 'NONE', // optional (NONE | ALL_OLD)
    ReturnConsumedCapacity: 'NONE', // optional (NONE | TOTAL | INDEXES)
    ReturnItemCollectionMetrics: 'NONE' // optional (NONE | SIZE)
  };

  db.putItem(params, function (err, data) {
    if (err) console.log(err); // an error occurred
    else console.log("inserted..."); // successful response
  });
10
mks

Vous pouvez utiliser le SDK DynamoDB Document Client:

http://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property

Le client de document simplifie l'utilisation des éléments dans Amazon DynamoDB en soustrayant la notion de valeurs d'attribut. Cette abstraction annote les types JavaScript natifs fournis en tant que paramètres d'entrée, ainsi que convertit les données de réponse annotées en types JavaScript natifs.

Pour votre cas, examinez spécifiquement la valeur d'attribut de carte (M) Transmise sous la forme MapAttribute dans l'exemple ci-dessous extrait de la documentation officielle. L'API Document Client prend en charge le marshalling/unmarshalling approprié entre les types Javascript et DynamoDB (ce qui signifie que vous n'avez pas à spécifier la Attribute Values (S,N,L,...) comme cela est requis lors de l'utilisation du SDK non basé sur un document):

var params = {
  TableName: 'Table',
  Item: {
     HashKey: 'haskey',
     NumAttribute: 1,
     BoolAttribute: true,
     ListAttribute: [1, 'two', false],
     MapAttribute: { foo: 'bar'},
     NullAttribute: null
  }
};

var docClient = new AWS.DynamoDB.DocumentClient();

docClient.put(params, function(err, data) {
  if (err) console.log(err);
  else console.log(data);
});
22
bsd

DynamoDB peut stocker des données JSON, également le format de données que vous souhaitez insérer. Il existe deux méthodes qui peuvent être utilisées pour formater les données lors de l'insertion dans DynamoDB et également lors de la récupération des données DB dans la méthode JSON souhaitée. https://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/Converter.html Ces méthodes sont: input et output.

J'ai partagé deux exemples d'extraits de code AWS lambda pour ce faire, j'espère que cela résout votre problème.

De la manière suivante, vous pouvez convertir les données JSON au format pris en charge par DynamoDB, puis les insérer:

const AWS = require('aws-sdk');
//setting the region
AWS.config.update({region: 'ap-south-1'});

// Create the DynamoDB service object
const ddb = new AWS.DynamoDB.DocumentClient();


const getParams = (updatedTasks)=>{
const params = {
  TableName: 'todo-application',
  Key: {
    "userID" : "[email protected]",
  },
  UpdateExpression: "set tasks = :updatedTasks",
   ExpressionAttributeValues:{
        ":updatedTasks":updatedTasks
    },
    ReturnValues:"UPDATED_NEW"
};
return params;
}

const dbQuery =(newTask)=>{
    let updatedTask = AWS.DynamoDB.Converter.input(newTask, true);
    console.log('updated task formatted ',updatedTask);
 let params = getParams(updatedTask);
  return new Promise((resolve,reject) =>{
  ddb.update(params, function(err, data) {
  if (err) {
    console.log("Error", err);
    reject(err);
  } else {
    console.log("Success", data);
    resolve(data.Item)
  }
});
});
}


exports.updateTodoJobsOfAUser = async (event) => {
    const insertObject = [
    {
    statement:'learn Dynamo DB', id: 23
    },
    {
    statement:'Learn Serverless Architecture',id:24 
    }]
    const data = await dbQuery(insertObject);
    const response = {
        statusCode: 200,
        body: JSON.stringify(data)
    };
    return response;
};

De la manière suivante, vous pouvez convertir les données DynamoDB au format JSON:

const dbQuery =()=>{
  return new Promise((resolve,reject) =>{
  ddb.get(params, function(err, data) {
  if (err) {
    console.log("Error", err);
    reject(err);
  } else {
    console.log("Success", data);
    resolve(data.Item)
  }
});
});
}


exports.getAllTodoJobsOfAUser = async (event) => {
    const data = await dbQuery();
    const formattedData =  AWS.DynamoDB.Converter.output(data, true);
    const response = {
        statusCode: 200,
        body: JSON.stringify(formattedData)
    };
    return response;
};

Ça marche pour moi. Heureux d'aider !! :)

3
Anand Ujjwal