我正在尝试学习node.js并使用DynamoDB做一些事情,我遇到了一些我没有找到任何工作示例的问题。我有一个表设置有2列,用户名和分数。用户名是主键,分数是排序键。
问题1 :我想查询用户评分的特定列表(WHERE得分IN列表)。我的测试用例是"username":["usr1","usr2,"usr3"]
。以下是我的代码。
'use strict';
const AWS = require('aws-sdk');
const doClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-2'});
exports.handler = (event,context,callback) => {
let params = {
TableName: 'highscores',
KeyConditionExpression: "#u = :val",
ExpressionAttributeNames:{
"#u": "username"
},
ExpressionAttributeValues: {
":val":event.username
}
//AttributesToGet: [ "username","score" ],
};
doClient.query(params, function(err,data){
if(err){
callback(err,null);
}else{
callback(null,data);
}
});
};
问题2 :我想更新桌面上的分数。在尝试此操作时,它会出错并说出"提供的关键元素与架构不匹配"。如果我在分数中加分,它只会替换用户名和分数匹配的记录。测试用例是"用户名":" usr","得分":998。以下是该代码。
'use strict';
const AWS = require('aws-sdk');
const doClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-2'});
exports.handler = (event,context,callback) => {
let params = {
Key: {
username: event.username,
},
UpdateExpression: "set score = :s",
ExpressionAttributeValues:{
":s":event.score
},
TableName: 'highscores'
};
doClient.update(params, function(err,data){
if(err){
callback(err,null);
}else{
callback(null,data);
}
});
};
感谢任何帮助,谢谢:)
答案 0 :(得分:1)
对于您的第一个问题,我建议您使用batchGet。
let params = {
RequestItems: {
TableName: 'highscores',
Keys: [
{username: 'usr1'},
{username: 'usr2'},
{username: 'usr3'},
],
AttributesToGet: [ "username","score" ],
};
doClient.batchGet(params, function(err,data){
if(err){
callback(err,null);
}else{
callback(null,data);
}
});
您的第二个问题是由于您的表架构造成的。 username
显然是您的分区键。您的主键由分区键和排序键组成,因此您需要同时提供更新。