3

我有一个用户数据库,我想返回姓 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);
    }
}); 
4

2 回答 2

1

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

但是,您可以轻松添加全局二级索引,以允许您使用另一个键作为分区。

在这种情况下,您可以添加一个 GSIlast作为您的分区键。

然后您就可以按姓氏查询全局二级索引(注意IndexName参数)。

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

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

请记住,使用扫描会变得昂贵并很快给您的桌子带来压力(更多细节在这里

于 2018-11-12T09:08:49.767 回答
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 表的文章。

于 2019-06-01T16:54:50.873 回答