web-dev-qa-db-fra.com

Ajouter un nouvel objet à un tableau JSON dans DynamoDB à l'aide de NodeJS

J'utilise une structure JSON pour stocker les détails d'une personne. Fondamentalement, le nom, le téléphone, l'horodatage enregistré, etc. seront d'autres attributs et la clé primaire sera l'adresse e-mail.

les emplacements marqués, les emplacements visités, searchHistory et recommendation sont les listes ou la carte comme AWS l'appelle. Il contiendra de nombreux objets JSON.

Structure JSON-

{
    "name":"Mama Miya",
    "phone":"9383883223",
    "registeredTimestamp":"some-time",
    "lastActiveTimestamp":"some-time",
    "signinType":"facebook",
    "additionalSigninData":{
        "key1":"value1",
        "key2":"value2"
    },
    "markedLocations":[
        {
            "latitude":"77.33",
            "longitude":"12.33",
            "name":"Home",
            "description":"my new home",
            "placeid":"55334433",
            "image":"url/abc.png"
        }
    ]
}

Depuis l'application, si l'utilisateur visite un nouvel emplacement, je dois ajouter un nouvel objet JSON aux -Localisés marqués. Ainsi, les emplacements marqués devraient ressembler à quelque chose-

"markedLocations":[
    {
        "latitude":"77.33",
        "longitude":"12.33",
        "name":"Home",
        "description":"my new home",
        "placeid":"55334433",
        "image":"url/abc.png"
    },{
        "latitude":"22.11",
        "longitude":"22.55",
        "name":"Ocean",
        "description":"Ocean",
        "placeid":"32423423",
        "image":"url/icean.png"
    }
]

Code/Schéma

var item = {
        'email': {'S': req.body.email},
        'phone': {'S': req.body.phone},
        'registeredTimestamp': {'S': req.body.registeredTimestamp},
        'lastActiveTimestamp': {'S': req.body.lastActiveTimestamp},
        'signinType': {'S': req.body.signinType},
        'version': {'S': req.body.version},
        'markedLocations': {'L': req.body.markedLocations}
    };

J'ai vérifié -

  • Dans DynamoDB, comment ajouter un élément à un champ de liste à l'aide de Java link

  • mise à jour d'un tableau JSON dans AWS dynamoDB link

  • Mise à jour d'un ensemble dans Dynamo db à l'aide de Node Js link

  • comment mettre à jour un élément dans dynamoDB en utilisant nodejs? lien

  • Et vérifié les documents AWS pour API UpdateItem . Je n'ai rien trouvé de pertinent à mon problème/doute.

Pouvez-vous me dire s'il existe un moyen d'ajouter le tableau JSON avec un nouvel objet JSON dans NodeJS? Je ne suis pas en mesure de procéder sur la façon de mettre en œuvre la même chose.

[~ # ~] ou [~ # ~]

Dois-je créer une table distincte pour chaque baie et avoir le courrier électronique comme clé primaire et l'horodatage comme clé de tri et continuer?

PS: Je suis nouveau sur DynamoDB, j'ai déjà travaillé avec MongoDB et il existe des moyens de travailler avec des tableaux et des objets JSON. Impossible de trouver un moyen ici.

29
bozzmob

Utilisez list_append() et if_not_exists() ensemble dans un pdateExpression pour ajouter à une colonne de liste potentiellement inexistante:

var AWS = require('aws-sdk')
var DB = new AWS.DynamoDB.DocumentClient()

function appendMarkedLocation (personId, location) {
  return DB.update({
    TableName: 'people',
    Key: { id: personId },
    ReturnValues: 'ALL_NEW',
    UpdateExpression: 'set #markedLocations = list_append(if_not_exists(#markedLocations, :empty_list), :location)',
    ExpressionAttributeNames: {
      '#markedLocations': 'markedLocations'
    },
    ExpressionAttributeValues: {
      ':location': [location],
      ':empty_list': []
    }
  }).promise()
}

appendMarkedLocation('somePeronId', {
  latitude: '22.11',
  longitude: '22.55',
  name: 'Ocean',
  description: 'Ocean',
  placeid: '32423423',
  image: 'url/icean.png'
}).then(console.log)
37
idbehold