我有一个用户数据库,我想返回所有姓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);
}
});
答案 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表的文章。