Ruby Can';不要使用DynamoDB GSI

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编写
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,因此我的索引的名称为a
display 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",
)