2017-01-24 1 views
4

ich eine DynamoDB Tisch haben, Benutzer, die eine Dokumentstruktur ähnlich der folgenden hat:DynamoDB: Wie Dokument zur Liste Werte in anhängen

{ 
    "id": "1", 
    "name": "john", 
    "hobbies": [ 
    { 
     "description": "painting", 
     "skill": "amateur" 
    }, 
    { 
     "description": "cooking", 
     "skill": "expert" 
    } 
    ] 
} 

Wie zu sehen ist, enthält die Dokumentstruktur eine Liste Attribut Hobbies, die eine Sammlung von Hobby- "Objekten" enthalten können.

Ich möchte eine Update-Anweisung schreiben, um ein neues Element zum List-Attribut hinzuzufügen, wenn es noch nicht existiert.

Zum Beispiel möchte ich ein Hobby mit einer "Beschreibung" von "Entwerfen" und einer "Geschicklichkeit" von "Amateur" zu meiner Update-Funktion weitergeben können, und da dieses Hobby noch nicht in der Liste steht von Hobbys sollte es der Liste hinzugefügt werden. Wenn das Hobby bereits vorhanden ist, sollte es nicht ein zweites Mal hinzugefügt werden.

Ich arbeite in Node.js und daher JavaScript und die AWS.DynamoDB.DocumentClient() mit einer Parameter-Map, um meine Funktionen auszuführen. Die AWS documentation war hilfreich, aber ich habe Mühe, Beispiele dafür zu finden, wie man Parameter so definiert, dass sie Elemente an ein Listenattribut anhängen, wie ich es beschreibe. Hat jemand vielleicht einen Ratschlag, wie man das macht?

Antwort

1

Sie können list_append() and if_not_exists() zusammen in einem UpdateExpression verwenden, um an eine möglicherweise nicht vorhandene Listenspalte anzuhängen, aber es gibt keine Möglichkeit, das Anhängen an diese Liste zu verhindern, wenn bereits ein Objekt mit denselben Eigenschaften in der Liste vorhanden ist.

Als Alternative Sie Ihre „Hobbies“ Liste mit einem String-Set ersetzen könnten und nur JSON.stringify() jeden „Hobbie“ vor dem Einsetzen (und JSON.parse() es, wenn die Werte wieder heraus zu lesen):

var AWS = require('aws-sdk') 
var DB = new AWS.DynamoDB.DocumentClient() 
var hobbieToAdd = JSON.stringify({ 
    description: "designing", 
    skill: "amateur" 
}) 
DB.update({ 
    TableName: "TableName", 
    Key: { id: "1" }, 
    UpdateExpression: "ADD #hobbies :hobbie", 
    ExpressionAttributeNames: { "#hobbies" : "hobbies" }, 
    ExpressionAttributeValues: { ":hobbie": DB.createSet([hobbieToAdd]) } 
}) 

eine Verwendung String Set würde sicherstellen, dass Duplikate nie erscheinen würden, aber es erfordert auch, dass Sie die Hobbies selbst (serialisieren).

+0

Dies ist nützlich, danke. Die Idee eines String-Sets ist etwas, das ich in Betracht ziehen könnte ... das Problem mit diesem Ansatz, dass der Benutzer (in einem anderen Anwendungsfall, den ich in der Frage nicht erwähnt habe) auch in der Lage ist, eines seiner Hobbys zu aktualisieren. Zum Beispiel haben sie vielleicht ein Hobby "malen" und was sie sind ein "Amateur", aber nach einer Weile können sie ihr Können für die "Malerei" Hobby auf "Zwischenstufe" zu aktualisieren. Und ich denke, dass ein String-Set diesen anderen Anwendungsfall komplizieren wird. – Stanley

Verwandte Themen