у меня есть только две проекции, определенные на уровне индекса Dynamo db GSI. но для создания ожидаемого ответа мне нужно получить и другие столбцы из Dynamo db.
Допустим, в моей таблице 20 столбцов, и только два из них упомянуты в глобальном вторичном индексе. Как я могу добиться этого с помощью GSI и загрузки данных из главной таблицы.
Нужно ли мне использовать запросы запросов или другой подход, о котором я думаю, это извлекать данные из индекса, а затем искать в основной таблице. Это мой существующий код:
public List<DynamoDBObject> getData(String gsiHashKey) {
DynamoDBObject dynamoDBObject= new DynamoDBObject();
command.setgsiHashKey(gsiHashKey);
final DynamoDBQueryExpression<DynamoDBObject> queryExpression =
new DynamoDBQueryExpression<>();
queryExpression.setIndexName("gsi_index_name");
queryExpression.setHashKeyValues(dynamoDBObject);
return mapper.query(DynamoDBObject.class,queryExpression)
}
Пожалуйста, предложите лучший способ добиться этого.




Как вы заметили, в GSI, если вы решили не проецировать все столбцы базовой таблицы в индексную таблицу, эти другие столбцы будут недоступны при запросе индекса. Причина этого не в лени разработчиков, а в эффективности: в GSI индексная таблица распределяется по всему кластеру DynamoDB иначе, чем базовая таблица, поэтому при чтении данных индексной таблицы нет способа эффективный также прочитать из базовой таблицы одновременно. Кстати, именно этим LSI отличается от GSI — в LSI индексная и базовая таблицы расположены вместе и могут читаться вместе, поэтому DynamoDB дает вам возможность запрашивать также непроецируемые столбцы.
Так что я думаю, что у вас осталось два варианта. Один из них — использовать запрос BatchGetItem для чтения данных базовой таблицы после чтения данных индекса. Обратите внимание, что при запросе к индексу вы всегда можете получить атрибуты ключа базовой таблицы, поэтому вы можете использовать их для чтения полных элементов из базовой таблицы. BatchGetItem, вероятно, является наиболее эффективным способом чтения, вместо извлечения элементов по одному с помощью GetItem.
Второй вариант — это, конечно же, проецирование большего количества базовых атрибутов или даже всех их на индексную таблицу. Это увеличит ваше хранилище и, возможно, затраты на чтение и запись, поэтому, хотите ли вы это сделать или нет, зависит от вашего приложения. В некоторых конкретных случаях даже имеет смысл иметь два индекса одного и того же атрибута с разным количеством проецируемых атрибутов.
Ключевые атрибуты базовой таблицы всегда проецируются в индексную таблицу, независимо от того, просили вы об этом или нет, в дополнение к конкретным атрибутам, которые вы просили проецировать. Пожалуйста, проверьте.
Что вы имеете в виду, что это работает для LSI, а не для GSI? Я только что проверил, создал таблицу с хэш-ключом "p" и вторичным индексом Глобальный с хэш-ключом "x" и проекцией "ProjectionType: 'INCLUDE', NonKeyAttributes: ['a', 'b']", и, конечно же, это в индексе были не только атрибуты a и b, там были и p, и x. А так как, в частности, есть «p», я могу теперь читать элементы из исходной таблицы.
то, что вы говорите, правильно ... но для меня есть и другие столбцы, а ПРОЕКЦИОННЫЙ УРОВЕНЬ - это только ключи. Итак, скажем, у меня есть хэш-ключ базовой таблицы "p" и столбцы "a", "b", " c". затем, если я запрошу GSI, то есть x, я также должен получить p, но получу ли я и другие столбцы. иначе я думаю, как вы предложили, мне нужно снова запросить базовую таблицу.
Да, пожалуйста, перечитайте мой ответ. Запрос GSI будет включать p, но не "a", "b" или "c". Если они вам нужны, вам нужно либо спроецировать их в GSI (с проекцией ВСЕХ или ВКЛЮЧИТЬ эти конкретные атрибуты), либо, если вы не хотите этого делать, вам также нужно прочитать из базовой таблицы (я дал несколько советов как).
Спасибо. Я попробую запрос BatchGetItem. Но еще один запрос относительно того же, поскольку у меня есть только один столбец проекции в GSI, т.е. скажем, идентификатор заказа, но это не хэш-ключ в базовой таблице. Я не уверен, будет ли работать операция получения базовой таблицы динамо БД, потому что я не есть хэш базовой таблицы или ключ диапазона для извлечения записи. Я правильно понимаю?