使用node.js sdk从dynamoDb获取最小值和最大值

时间:2016-08-31 06:43:33

标签: node.js amazon-web-services amazon-dynamodb aws-sdk

我使用amazon dynamoDb来存储我的数据。我创建了像这样的数据库

  

分区键:userid,类型:字符串

     

排序键:得分,类型:数字

我插入了一些行。

  

manaf1 | 100

     

manaf2 | 500

     

manaf1 | 200

     

manaf1 | 600

我需要获得max&所选用户的最低分数。这是我的代码

var AWS = require("aws-sdk");

AWS.config.update({
    region: "myRegion"
});

var docClient = new AWS.DynamoDB.DocumentClient();

var params = {
    "TableName": "tableName",
    "KeyConditionExpression": "#userid = :userid ",
    "ExpressionAttributeNames": {
        "#userid": "userid"
    },
    "ExpressionAttributeValues": {
        ":userid": {
            "S": "manaf1"
        }
    }
};

docClient.query(params, function (err, data) {
    if (err) {
        console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
        console.log("Query succeeded.");
    }
});

但是在运行此代码时出现错误。

Unable to query. Error: {
  "message": "One or more parameter values were invalid: Condition parameter type does not match schema type",
  "code": "ValidationException",
  "time": "2016-08-31T06:12:13.825Z",
  "requestId": "S1DFFJNDNVV4KQNSO5AEDASFMVJF66Q9ASHDFUAAJG",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 0
}

我需要像

这样的输出
  

manaf1最低分= 100

     

manaf1最高分= 600

  1. 是否可以从dynamoDb获取最大或最小数字字段?
  2. 这段代码有什么问题?

1 个答案:

答案 0 :(得分:6)

请更改ExpressionAttributeValues,如下所述。这应该可以解决错误。

ExpressionAttributeValues : {
        ':userid' : 'manaf1'        
    }

要按降序对分数进行排序,可以将ScanIndexForward设置为false。

var params = {
    TableName : table,
    KeyConditionExpression : 'userid = :userid',
    ExpressionAttributeValues : {
        ':userid' : 'manaf1'        
    },
    ScanIndexForward: false
};
  

如果ScanIndexForward为true,DynamoDB将按顺序返回结果   存储它们(按排序键值)。这是默认值   行为。如果ScanIndexForward为false,则DynamoDB将读取结果   按排序键值反向排序,然后将结果返回给   客户端。

     

类型:布尔值

要按升序对分数进行排序,可以将ScanIndexForward设置为true。

使用 ScanIndexForward ,您可以将MIN和MAX得分记录作为结果中的第一条记录。