在DynamoDB putItem JSON数组中将变量作为键名传递

时间:2016-04-01 16:17:31

标签: node.js amazon-dynamodb

我有一个简单的JSON数组,我正在尝试使用变量设置地图键。 该数组使用DynamoDB的地图功能,第一个名为'hours'的地图包含一个嵌套的Map,我想要一个15的密钥。但是,我希望该密钥根据一天中的小时而改变,我传递了一个变量进入JSON数组嵌套的映射键,它将反映出来。

对于以下内容,我只是将其硬编码为15以简化问题。

问题在于,DynamoDB确实运行了putItem,它将变量hour更改为字符串“hour”,并在操作期间忽略set变量的值。关于如何将变量值传递给键名的任何想法?

var hour = "15";

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

1 个答案:

答案 0 :(得分:2)

ExpressionAttributeNames:中使用ExpressionAttributeValues:params。以下(使用documentClient自动转换javascript类型)应该有希望指向正确的方向,但你必须决定是否添加新的#hr嵌套字段,删除旧的等等,而且,这只能起作用如果#hrs地图存在于项目中 - 即使作为空地图。最后,如果它们已经存在,它将覆盖现有的#hr嵌套字段,如果不存在,则会创建新的嵌套字段。再次,不确定你的绝对需要。

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
    }
}

更多信息可以在这里找到: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames

在这里: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

我希望这会有所帮助。