node.js - 游戏排行榜前 10 名得分 dynamoDB nodejs sdk 查询
问题描述
我有一个具有以下字段的 dynamodb -
id (primary key) (string)
name (user name) (string)
score (sort key) (number)
player (type - regular/new etc.) (string)
我只是想从数据库中获得前 10 名。按照 AWS https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#query-property的文档尝试了几个查询
这是我的查询代码 -
const ddb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});
function getItems(){
var params = {
ExpressionAttributeValues: {
":v1": {
S: "regular"
}
},
KeyConditionExpression: "player = :v1",
TableName: "cloudtag_result"
};
return ddb.scan(params).promise();
}
但它给了我以下错误
2021-08-21T08:36:43.092Z 1bbd5490-4248-4f06-94ea-724e6d23dac5 ERROR ValidationException: Query condition missed key schema element: id
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:52:27)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
code: 'ValidationException',
time: 2021-08-21T08:36:43.031Z,
requestId: 'JH91VON2KGVNP7HF41VCBELTUVVV4KQNSO5AEMVJF66Q9ASUAAJG',
statusCode: 400,
retryable: false,
retryDelay: 47.72972319109784
}
解决方案
DynamoDB 有一个基本限制,即您绝对必须在所有查询中指定分区键(或您所称的主键)。它必须与表中的内容完全匹配,不允许“模糊”查询。
您在 上查询player = ..
,但没有指定 id。没有办法让它在发电机中工作,你需要指定主键。
如果您的访问模式要求您能够按玩家名称查找,则您需要将玩家名称放在 PK 或 SK 中,否则您需要在您的应用程序中而不是在 dynamodb 服务器上进行过滤。
您可能想要所谓的“单表设计”。Rich Houlihan 的这次演讲强烈推荐给任何使用 dynamo 进行数据建模的人 :)
推荐阅读
- c# - 在 DevOps 上构建时如何解决缺少的 Office 参考?
- php - 如何将 HTML 标记添加到字符串中的特定单词并将它们与 PHP 中的其余单词一起打印?
- apache-nifi - 当数据在任何处理器中排队时如何在 NiFi 中创建警报?
- angular - 在 Spartacus 中自定义产品模型以在 ngrx 商店中设置新属性
- wkhtmltopdf - odoo.sh 版本 14 WKHTMLTOPDF 0.12.25:无法调用主机打印服务 (HTTPError)。如何规避这一点?
- python - 在网站中显示上传的图片 - Django
- php - 是否可以在 上使用占位符?
- spring-boot - 403 禁止错误 POST - Google Cloud IoT
- python - 如何在不中断用户输入的情况下打印输出?
- javascript - 我的 switch 语句每次都打印默认值 - 这是一个简单的石头、纸、剪刀游戏