问题描述
我用Ruby On Jets
编写并使用Dynomite与DynamoDB一起工作。我对GSI有问题。
我有一个包含3个字段的表:display,value,title_hilight
。我需要在所有三个字段中使用搜索。为此,我决定使用全局二级索引。出于测试目的,我决定在“显示”字段中添加GSI。
我创建了迁移
class SoMetableMigration<Dynomite::Migration
def up
create_table 'table-name' do | t |
t.partition_key "id: string: hash" # required
t.gsi do | i |
i.partition_key "display: string"
end
end
end
end
然后我创建了一个模型
require "active_model"
class ModelName<ApplicationItem
self.set_table_name 'some-model-name'
column :id,:display,:val,:title_hilight
end
现在,我正在尝试通过“显示”字段中的值查找记录:ModelName.where ({display: 'asd'})
,但出现错误:
Aws::DynamoDB::Errors::ValidationException (Query condition missed key schema element)
这是aws dynamodb describe-table --table-name table-name --endpoint-url http://localhost:8000
{
"Table": {
"AttributeDeFinitions": [
{
"AttributeName": "id","AttributeType": "S"
},{
"AttributeName": "display","AttributeType": "S"
}
],"TableName": "some-table-name","KeySchema": [
{
"AttributeName": "id","KeyType": "HASH"
}
],"TableStatus": "ACTIVE","CreationDateTime": "2020-10-26T14:52:59.589000+03:00","ProvisionedThroughput": {
"LastIncreaseDateTime": "1970-01-01T03:00:00+03:00","LastDecreaseDateTime": "1970-01-01T03:00:00+03:00","NumberOfDecreasesToday": 0,"ReadCapacityUnits": 5,"WriteCapacityUnits": 5
},"TableSizeBytes": 112,"ItemCount": 1,"TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/some-table-name","GlobalSecondaryIndexes": [
{
"IndexName": "display-index","KeySchema": [
{
"AttributeName": "display","KeyType": "HASH"
}
],"Projection": {
"ProjectionType": "ALL"
},"IndexStatus": "ACTIVE","ProvisionedThroughput": {
"ReadCapacityUnits": 5,"WriteCapacityUnits": 5
},"IndexSizeBytes": 112,"IndexArn": "arn:aws:dynamodb:ddblocal:000000000000:table/some-table-name/index/display-index"
}
]
}
}
我将真实表的名称更改为SoMetableName(有时只是表名)。其余代码保持不变。感谢您的帮助
解决方法
如here所述:
在DynamoDB中,您可以选择创建一个或多个二级索引 在一个表上并以与查询a相同的方式查询这些索引 桌子。
您需要在查询中明确指定GSI名称。
,@jny答案是正确的。他告诉我使用其他索引。我不知道如何使用其他模型(请参阅他的回答的注释),但是带有索引的想法非常非常正确。这就是现在一切对我有效的方式
http://