Ruby Can';不要使用DynamoDB GSI
我使用RubyonJets编写Ruby Can';不要使用DynamoDB GSI,ruby,amazon-web-services,amazon-dynamodb,rubyonjets,Ruby,Amazon Web Services,Amazon Dynamodb,Rubyonjets,我使用RubyonJets编写RubyonJets并使用DynamoDB。我对GSI也有问题 我有一个表,它有3个字段:display、value、title\u hilight。我需要在所有三个字段中使用搜索。为此,我决定使用全局二级索引。出于测试目的,我决定为“display”字段添加GSI。 我创建了迁移 class SomeTableMigration<Dynomite::Migration def up create_table 'table-name' do | t
RubyonJets
并使用DynamoDB。我对GSI也有问题我有一个表,它有3个字段:
display、value、title\u hilight
。我需要在所有三个字段中使用搜索。为此,我决定使用全局二级索引。出于测试目的,我决定为“display”字段添加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
下面是aws dynamodb descripe 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,
"ItemCount": 1,
"IndexArn": "arn:aws:dynamodb:ddblocal:000000000000:table/some-table-name/index/display-index"
}
]
}
}
我将实际表的名称更改为SomeTableName(有时只是表名)。代码的其余部分保持不变。感谢您的帮助如上所述:
在DynamoDB中,您可以选择创建一个或多个二级索引
并以与查询索引相同的方式查询这些索引
桌子
您需要在查询中明确指定GSI名称。如前所述:
在DynamoDB中,您可以选择创建一个或多个二级索引
并以与查询索引相同的方式查询这些索引
桌子
您需要在查询中明确指定GSI名称。@jny答案正确。他告诉我使用不同的索引。我不知道如何使用不同的模型(见他回答中的评论),但使用索引的想法非常非常正确。这就是我现在的工作方式
ModelName.query(
index_name: 'display-index',
expression_attribute_names: { "#display_name" => "display" },
expression_attribute_values: { ":display_value" => "das" },
key_condition_expression: "#display_name = :display_value",
)
@我的答案是正确的。他告诉我使用不同的索引。我不知道如何使用不同的模型(见他回答中的评论),但使用索引的想法非常非常正确。这就是我现在的工作方式
ModelName.query(
index_name: 'display-index',
expression_attribute_names: { "#display_name" => "display" },
expression_attribute_values: { ":display_value" => "das" },
key_condition_expression: "#display_name = :display_value",
)
谢谢你的回答和帮助。我想不出新型号会是什么样子。这可以避免吗?也就是说,我可以用另一种方法解决这个问题吗?新的模型将与您的模型类似,但以索引名作为表名感谢您的回答和帮助。我想不出新型号会是什么样子。这可以避免吗?也就是说,我可以用另一种方法解决这个问题吗?新模型将与您的模型类似,但以索引名作为表名我为显示字段添加了GSI,因此我的索引的名称为a
display index
i为显示字段添加了GSI,因此我的索引的名称为adisplay index
ModelName.query(
index_name: 'display-index',
expression_attribute_names: { "#display_name" => "display" },
expression_attribute_values: { ":display_value" => "das" },
key_condition_expression: "#display_name = :display_value",
)