2016-05-12 5 views
5

Ich habe ein Attribut vom Typ String Set erstellt. Wenn ich create das Item erstellen und ein Attribut des Typs SS zuweisen, funktioniert alles. Aber wenn ich versuche, dieses Attribut zu aktualisieren, ändert sich der Datentyp in eine Liste ("L").Wie aktualisiert man ein Element in Dynamodb vom Typ String Set (SS)?

Ich versuche dies:

qw = new AWS.DynamoDB.DocumentClient(); 

var params = { 
    TableName : "myTable", 
    Key: { 
    "id": somekey 
    }, 
    UpdateExpression: "set ssvar= :arrp", 
    ExpressionAttributeValues: { 
    ":arrp": [ "test", "test2" ] 
    } 
}; 

qw.update (etc.) 

Dies führt zu einer Änderung der Datentyp in DynamoDB und anstelle eines Strings Satz bekomme ich eine Liste:

"ssvar": { 
      "L": [ 
       { 
        "S": "test" 
       }, 
       { 
        "S": "test2" 
       } 
      ] 
     } 

ich alle Arten von Lösungen versucht haben, wie unten, aber immer wird mein Datentyp geändert.

ExpressionAttributeValues: { 
    ":arrp": 
     "SS": [ "test", "test2" ] 
    } 

Wie kann ich ein Attribut vom Typ String-Satz aktualisieren?

+0

ich das gleiche Problem mit Golang habe. Ein Segment von Strings wird in dynamodb List auf dynamodbattribute.Marshal konvertiert. Wie kann ich es in dynamodb Stringset konvertieren? – Aprimit

Antwort

1

Dies ist ein Artefakt der Verwendung des DocumentClient - StringSet ist kein JSON-Typ.

Der DocumentClient konvertiert ein StringSet in den Array-eigenen JavaScript-Typ: https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/converter.js#L61. Anschließend serialisiert der Client das native JavaScript-Array als DynamoDB-Listentyp: https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/converter.js#L12.

Wenn Sie den StringSet Typ verwenden möchten, können Sie die Low-Level-API verwenden können: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html

5

Ab September 2015 gibt es eine createSet Funktion im DocumentClient, die Sie für diese verwenden können.

UPDATE - added Beispiel

Ich habe Ihren Beispielcode geändert, um diese Funktion zu nutzen:

qw = new AWS.DynamoDB.DocumentClient(); 

var params = { 
    TableName : "myTable", 
    Key: { 
    "id": somekey 
    }, 
    UpdateExpression: "set ssvar= :arrp", 
    ExpressionAttributeValues: { 
    ":arrp": qw.createSet([ "test", "test2" ]) 
    } 
}; 

qw.update (etc.) 
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – ekad

+0

@ekad Danke, guter Tipp. Die Antwort wurde mit einem Beispiel aktualisiert :) – TorAL

+0

Genau das, was ich brauchte! – Julian

Verwandte Themen