dynamodb滚动平均场

时间:2017-07-10 16:03:35

标签: amazon-dynamodb aws-lambda

我有一个带有列的dynamodb表 Id,Count,TotalNumber,AverageNumber

每隔一分钟左右写一个新数字,这样它就会增加到TotalNumber,现在我如何按计数获取当前计数和TotalNumber,然后计算滚动平均值?

attrNames["#number"] = "totalNumber";
attValues[":n"] = number;

attrNames["#count"] = "count";
attValues[":c"] = 1;

var params = {
    Key: { id: id},
    TableName: "myTable",
    UpdateExpression: "Add #number :n, #count :c",
    ExpressionAttributeNames: attrNames,
    ExpressionAttributeValues: attValues,
    ReturnValues: "UPDATED_NEW"
};  
console.log(params);

dynamo.updateItem(params, function(err,res){
    console.log(err);
});

我知道我需要一个

var getParams ={ Key: { id: id},
    TableName: "myTable",
}; 

但我会从哪里去?

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解您的问题,但DynamoDB不支持关系数据库的聚合查询。

如果您要尝试的只是查询特定项目(即您拥有ID)并想要使用Count / TotalNumber平均值更新所述项目,那么您绝对可以做到这一点,这将是两个请求:一个查询,一个更新,其中包含客户端计算的更新值。

但是,如果您希望使用单个查询更新多个项目,那么这不起作用(这意味着您必须编写客户端逻辑来查询项目,然后分别为每个项目发出更新请求)。

同样适用于聚合情况。如果您需要根据涉及多个其他项的查询更新项目,则必须首先查询以收集源数据,然后使用客户端的计算值发出更新。

答案 1 :(得分:0)

你会有多少个号码?您可以存储按其传入顺序(范围键)排序的数字,然后通过存储滚动总和并添加新数字并在每次写入时减去最旧数字来计算滚动平均值。