2017-10-17 7 views
0

Nous avons beaucoup de mal à faire une mise à jour partielle dans DynamoDB.Comment mettre à jour partiellement une table DynamoDB?

Essayer d'utiliser les meilleures pratiques en NoSQL en utilisant des agrégats au lieu des entités si nos données ressemble un peu à ceci:

[ 
{ 
    "userLogin": { 
     "ipAddress": "123.222.121.1234", 
     "lastLogin": "2017-10-16T17:38:59.818Z", 
     "userAgent": "bob", 
     "geoLocation": "lat-121 long-312" 
    }, 
    "addresses": { 
     "billingAddress": { 
      "streetName": "york street", 
      "province": "ontario", 
      "city": "toronto", 
      "streetNumber": "18", 
      "postalCode": "m5a2v7" 
     }, 
     "businessAddress": { 
      "streetName": "york street", 
      "province": "ontario", 
      "city": "toronto", 
      "streetNumber": "18", 
      "postalCode": "m5a2v7" 
     }, 
     "mailingAddress": { 
      "streetName": "york street", 
      "province": "ontario", 
      "city": "toronto", 
      "streetNumber": "18", 
      "postalCode": "m5a2v7" 
     }, 
    }, 
    "paymentTransaction": { 
     "orderId": 5, 
     "amount": 75, 
     "transactionTimestamp": "2017-10-16T17:38:59.818Z" 
    }, 
    "userId": "00uc4sxyi7gfQoFum0h7", 
    "phoneNumbers": { 
     "workNumber": "647-123-1234", 
     "homeNumber": "647-321-4321" 
    }, 
    "userProfile": { 
     "role": "admin", 
     "verifiedTimeStamp": "2017-10-16T17:38:59.818Z", 
     "termsConditionTimeStamp": "2017-10-16T17:38:59.818Z", 
     "verified": "TRUE", 
     "createdTimeStamp": "2017-10-16T17:38:59.818Z", 
     "termsConditionVersion": "1.0", 
     "email": "[email protected]" 
    } 
} 

]

Tout ce que nous voulons faire est de faire une demande avec un corps comme ceci:

PUT /api/user-profiles/00uc4sxyi7gfQoFum0h7 
body: { 
    "userLogin": { "lastLogin": "2017-12-16T17:38:59.818Z" } 
} 

et de le mettre à jour l'un attribut dans la table utilisateur. L'API updateItem semble nécessiter de définir les attributs que vous souhaitez mettre à jour avant de les mettre à jour, mais nous souhaitons qu'il soit plus flexible et dynamique en fonction du corps de la requête.

Ce fil semble dire qu'il est impossible:

How to update multiple items in a DynamoDB table at once

Si oui, quelle est la meilleure façon d'aller à la mise à jour juste un objet attribut partiel à l'intérieur d'un élément dans DynamoDB?

Répondre

2

Dans dynamoDB si votre userLogin est un type de carte, vous pouvez mettre à jour la valeur de lastLoginkey. En Java ci-dessous le code peut aider. Ici, le nom de la colonne serait userLogin et newKey serait lastLogin. extrait de code complet peut être trouvé here

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW). 
     withUpdateExpression("set #columnName." + newKey + " = :columnValue"). 
     withNameMap(new NameMap().with("#columnName", updateColumn)). 
     withValueMap(new ValueMap().with(":columnValue", newValue)).withConditionExpression("attribute_exists("+ updateColumn +")"); 

table.updateItem(updateItemSpec); 
+0

Comment voulez-vous modifier si vous ne saviez pas exactement quelle colonne (s) et les touches que vous vouliez mettre à jour? Que faire si le corps de la requête contenait une clé, ou plusieurs clés, avec un nombre x de champs? Je pense utiliser le même format que votre réponse, mais avec plus d'expressions conditionnelles et une sorte d'itérateur du corps de la requête pour vérifier plusieurs clés afin d'instancier d'autres opérations de mise à jour. Est-ce que ça sonne bien? –

+1

Oui, vous pouvez utiliser l'itération pour mettre à jour plusieurs clés et cela fonctionnera pour vous –