2016-04-01 2 views
0

Ich habe ein einfaches JSON-Array, das ich versuche, einen Map-Schlüssel auf eine Variable setzen. Das Array verwendet die Kartenfunktionalität von DynamoDB und die erste Karte mit dem Namen 'Stunden' enthält eine verschachtelte Karte, die einen Schlüssel von 15 haben soll. Da ich aber diesen Schlüssel abhängig von der Tageszeit ändern möchte, habe ich eine übergeben Variable in den verschachtelten JSON-Kartenschlüssel, der dies widerspiegelt.Übergeben Variable als Schlüsselname in DynamoDB putItem JSON-Array

Für das folgende habe ich es nur hart auf 15 codiert, um das Problem zu vereinfachen.

Das Problem ist, dass DynamoDB in der Tat das putItem mit diesem darin führt, ändert es die Variable Stunde in nur eine Zeichenfolge "Stunde" und ignoriert den Wert der Variablen während der Operation. Irgendwelche Ideen, wie man den Variablenwert an den Schlüsselnamen weitergibt?

var hour = "15"; 

"hours" : {"M" : { 
    hour : {"M" : { //The hour variable is used as a key 
      "action1" : {"N" : "1"}, 
      "action2" : {"N" : "1"} 
      } 
    } 
    } 
} 

Antwort

0

Verwenden ExpressionAttributeNames: und ExpressionAttributeValues: in Ihrem params. Die folgende Anleitung (die Verwendung von documentClient zur automatischen Konvertierung von Javascript-Typen) sollte Sie hoffentlich in die richtige Richtung weisen, aber Sie müssen entscheiden, ob Sie neue #hr Nestedfields hinzufügen, alte löschen, usw., und dies funktioniert nur, wenn die #hrs Karte existiert zunächst im Gegenstand - auch wenn es eine leere Karte ist. Schließlich überschreibt dies bestehende #hr Nestedfields, wenn sie bereits existieren oder neue erstellen, wenn sie nicht existieren. Auch hier ist Ihr absolutes Bedürfnis nicht sicher.

var hour = 15; //or whatever number you need 
var dynamoDBdc = new AWS.DynamoDB.DocumentClient(); 
var params = { 
     TableName:     <yourtablename>, 
     Key:      <yourkey>, 
     UpdateExpression:   "SET #hrs.#hr = :value", 
     ExpressionAttributeNames: {"#hrs": "hours", "#hr": hour.toString()}, 
     ExpressionAttributeValues: {":value": {"action1": 1, "action2": 2}}, 
     ReturnValues:    "ALL_NEW" //or whatever you want here 
    }; 
dynamoDBdc.update(params, function(err, data) { 
    if(err) { 
     //handle it 
    } 
    else { 
     //your subsequent code 
    } 
} 

Weitere Informationen finden Sie hier: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames

und hier: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

Ich hoffe, das hilft.