2016-12-06 3 views
1

Unten ist ein Beispielartikelobjekt/Datensatz in DynamoDb gespeichert. Ich verwende NodeJS und AWS.DynamoDB.DocumentClient, um auf die Datenbank zuzugreifen.Dynamodb - Aktualisiere den Wert des JSON-Objekts in einem Array von Objekten.

Ich baue eine PUT-Funktion aus, um den Status für ein JSON-Objekt in einem Array zu aktualisieren. Die Funktion hat Zugriff auf uuid und uuid des Raums. Wie kann ich einfach (kreativ) den Wert des entsprechenden Feldes status aktualisieren, wenn das Array von JSON-Objekten angegeben wird?

Params:

let params = { 
    TableName: room-table, 
    Key: { 
    uuid: event.body.uuid 
    }, 
    UpdateExpression : "??", 
    ExpressionAttributeNames: { 
     "??":"??" 
    }, 
    ExpressionAttributeValues:{ 
    "??":"??" 
    }, 
    ReturnValues:"ALL_NEW" 
}; 

Artikel Objekt:

{ 
    "Item": { 
    "uuid": "77b1e88e-5e60-44d9-b6ca-aec345c0dc99", 
    "rooms": [ 
     { 
     "room": "303", 
     "status": "pending", 
     "uuid": "b8f1c1a8-04a9-4c2e-82ad-bc3e81face35" 
     }, 
     { 
     "room": "302", 
     "status": "pending", 
     "uuid": "42fdc61a-4a25-4316-90c9-60209875d208" 
     }, 
     { 
     "room": "678", 
     "status": "pending", 
     "uuid": "7bedc115-20ed-4c3e-9cd7-7fed0520f4df" 
     } 
    ], 
    "status": "pending" 
    } 
} 
+1

Es in einer einzigen Aktualisierungsanforderung nicht möglich ist, weil Dynamo nicht in der Lage sein, zu „finden“ der richtigen Index in der 'Item.rooms' Array für dich. Die einzige Möglichkeit, dies zu ermöglichen, wäre, dass Sie 'Item.rooms' von einem Array zu einem Objekt ändern, bei dem jeder Schlüssel die Uuid eines Raumes ist. Dann könnten Sie einen Aktualisierungsausdruck von etwas wie 'SET rooms. # RoomUUID.status =: roomStatus' verwenden. – idbehold

+0

Ok, kannst du das als deine Antwort einreichen? Scheint, ich muss Unterstreich verwenden, um mir zu helfen. – user1322092

Antwort

1

Dies ist nicht möglich mit ExpressionAttributeValues. Ich hatte eine Funktion zu bauen, das Objekt, ähnlich wie unten zu ändern:

function setStatus(jsonObj, uuid, newStatus) { 
    for (var i=0; i<jsonObj.length; i++) { 
    if (jsonObj[i].uuid === uuid) { 
     jsonObj[i].status = newStatus; 
     return jsonObj; 
    } 
    } 
} 
0
let params = { 
    TableName: room-table, 
    Key: { 
    uuid: event.body.uuid 
    }, 
    UpdateExpression : "SET #stat = :stat", 
    ExpressionAttributeNames: { 
     "#stat": "status" 
    }, 
    ExpressionAttributeValues:{ 
    ":stat": "updatedStatusValue" 
    }, 
    ReturnValues:"ALL_NEW" 
}; 

ExpressionAttributeNames benötigt wird, weil Status ein DynamoDB reserved word ist. Weitere Informationen zu Platzhaltern für Attributnamen und Attributwerte finden Sie unter DynamoDB docs.

+0

Gerade bemerkt, dass Ihre Frage über das Aktualisieren eines gesamten Arrays ist. Meine Antwort ist über 1 Element .... –

+0

Hallo Peter, mein Ziel ist es, ein einzelnes Objekt im Array zu aktualisieren, nicht das gleiche Feld in allen Array-Objekten. – user1322092

Verwandte Themen