我使用amazon dynamoDb存储我的数据。我创建了这样的数据库
分区键:userid,类型:String
排序键:分数,类型:数字
我插入了一些行
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 maximum score = 600
- 是否有可能从dynamoDb获得最大或最小的数字字段?
- 这个代码的问题是什么?
请按如下所述更改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你可以得到最小和最大分数记录作为结果的第一条记录。