我有一张表,其中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');
}
});
编辑: 所以我在这方面取得了一些进展,我认为我已经接近了
因此,任何相关的帮助,而不仅仅是随机发布的帖子都会有所帮助
答案 0 :(得分:0)
您可以尝试的一个想法是创建一个允许使用数据列匹配查询数据的GSI。
然后您可以使用此GSI查询项目,如果有数据,您可以更新项目并将其写回。
唯一可能的缺点是,这基本上是一种检查 - 然后行为,这对您来说可能是也可能不是问题。如果这是一个问题,您可以尝试使用DynamoDB transactions,但它们仅针对Java客户端和have high cost实现。