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

Javascript 如何在AWS DynamoDB中按排序键进行查询?,javascript,node.js,amazon-web-services,amazon-dynamodb,dynamodb-queries,Javascript,Node.js,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,我有一个用户数据库,我想返回所有姓氏为X的用户。我目前将“last”作为表的排序键。我正在运行以下代码,但得到了一个“查询条件缺少关键模式元素”错误 要进行查询,您必须提供一个分区键,所以对于您的表,您唯一的选择就是进行扫描(这很昂贵,而且几乎不推荐) 但是,您可以轻松地添加,以允许您使用另一个键作为分区 在这种情况下,您可以添加一个带有last作为分区键的GSI 然后您就可以按姓氏查询全局二级索引(注意参数) 但是,如果您想选择扫描路线,则需要使用: docClient.scan({ Ta

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


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

但是,您可以轻松地添加,以允许您使用另一个键作为分区

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

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

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

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

请记住,使用扫描可能会很昂贵,并且会很快给您的表带来压力()

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

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

现在您可以查询所有以ln\ux开头的分区。是的,在noSql中应该有双重数据。有一些关于如何设计dynamoDB表的文章。

感谢您的回复!如果我决定改为进行扫描,我将如何修改我的代码?不用担心-我添加了一个示例-尽管如果可能的话,您确实应该避免频繁扫描dynamo db表。太棒了,谢谢。我还要看一下全局索引选项。祝你好运!别忘了在回答的问题上做记号!仅供参考,GSI不要求主键是唯一的,因此不需要为GSI提供排序键。(尽管添加一个也没什么坏处。)
partition | sort
fn_hans | ln_zimmer
fn_steve | ln_jobs
ln_zimmer | fn_hans
ln_jobs | fn_steve