如何在AWS DynamoDB中按排序键查询?

时间:2018-11-11 22:55:10

标签: javascript node.js amazon-web-services amazon-dynamodb dynamodb-queries

我有一个用户数据库,我想返回所有姓X的用户。我目前使用“ last”作为表的排序键。我正在运行以下代码,但收到“查询条件缺少关键架构元素”错误。

var params = { TableName: 'Patients',
    KeyConditionExpression: '#id = :idNum',
    ExpressionAttributeNames: { 
       '#id': 'last' 
    },
    ExpressionAttributeValues: { 
      ':idNum': 'Test' 
    } 
};

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

2 个答案:

答案 0 :(得分:1)

要查询,您必须提供一个分区键,因此对于您的表,您唯一的选择就是进行扫描(这很昂贵,几乎从不建议这样做)。

不过,您可以轻松添加Global Secondary Indexes,以允许使用另一个键作为分区。

在这种情况下,您可以添加带有last作为分区键的GSI。

那么您就可以通过姓氏查询全局二级索引(注意IndexName参数)。

但是,如果要走扫描路线,则需要使用:

docClient.scan({
  TableName: 'Patients',
  FilterExpression: '#l = :l',
  ExpressionAttributeNames: { '#l': 'last' },
  ExpressionAttributeValues: { ':l': 'Test' },
  Limit: 1
}, (err, data) => { /* callback */ })

请记住,使用扫描会变得昂贵,并且会很快对您造成压力(more detail here

答案 1 :(得分:0)

这不是应使用DynamoDB / NoSQL的方式。您可以按照thomasmichaelwallace的建议创建GSI,也可以将用户的姓氏用作分区键。您可以在所有姓氏分区键之前添加“ ln_”,以将其与其他分区键分开。如果在主键之前将名字用作分区,则现在应该像这样:

partition | sort
fn_hans | ln_zimmer
fn_steve | ln_jobs
ln_zimmer | fn_hans
ln_jobs | fn_steve

现在,您可以查询以ln_开头的所有分区。是的,您应该在noSql中复制数据。 NoSQL Design有一些有关如何设计dynamoDB表的文章。