基于3列的dynamodb更新项目

时间:2017-07-27 13:43:21

标签: node.js amazon-dynamodb aws-lambda

我有一张表,其中custID和sensor作为我的主键和排序键

custID      sensor      data          date
joe           123       wind       01/01/1901
mary          456       rain       01/02/1901

现在当新记录如下所示

新行:

joe, 123, temp, 01/04/1901

更新行:

joe, 123, wind, 01/07/1901

我想将其作为新行输入,但如果数据列匹配,我想更新该行。现在,如果我将我的密钥更改为传感器和数据,这将有效,但如何使用当前密钥执行此操作?

我的实际数据结构比这复杂得多,但我想让问题保持简单。

var updateExpressions =[];
updateExpressions.push("#data"+counter+"=:data"+counter+", #date"+ counter +" = :date"+ counter);
attrNames["#data"+ counter] = "data";
attValues[":data"+ counter] = data;

attrNames["#date"+ counter] = "date";
attValues[":date"+ counter] = date;
counter++;

然后在load params

var loadparamsP = {

    TableName: "mytable",
    Key: { sensor: sensor, custID: custID},
    ExpressionAttributeNames:attrNames,
    ExpressionAttributeValues:attValues,
    UpdateExpression:"SET "+ updateExpressions,
   ReturnValues: "UPDATED_NEW"
};
dynamo.updateItem(loadparamsP, function(err,res){
console.log(res + "res");
        if (err)
            callback(err)
        else{
            callback(null, 'Data inserted');

        }
});

编辑: 所以我在这方面取得了一些进展,我认为我已经接近了

因此,任何相关的帮助,而不仅仅是随机发布的帖子都会有所帮助

1 个答案:

答案 0 :(得分:0)

您可以尝试的一个想法是创建一个允许使用数据列匹配查询数据的GSI。

然后您可以使用此GSI查询项目,如果有数据,您可以更新项目并将其写回。

唯一可能的缺点是,这基本上是一种检查 - 然后行为,这对您来说可能是也可能不是问题。如果这是一个问题,您可以尝试使用DynamoDB transactions,但它们仅针对Java客户端和have high cost实现。