一些使用DynamoDB和node.js的问题

时间:2018-03-16 13:33:25

标签: node.js nosql amazon-dynamodb

我正在尝试学习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);
    }
});
};

感谢任何帮助,谢谢:)

1 个答案:

答案 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显然是您的分区键。您的主键由分区键和排序键组成,因此您需要同时提供更新。