2016-03-17 4 views
2

У меня есть разделKey, который состоит из двух строк, например. идентификатор пользователя: UserName. Например, 1234: John, 4567: Mark и т. Д. Я хочу запросить все записи, которые соответствуют подстроке, определенной UserName, например. Найдите все записи, содержащие «Марк» в разделе раздела. Как это сделать с использованием API-интерфейсов DynamoDb в Java?Как запросить ключи раздела, содержащие определенную подстроку в dynamoDb?

ответ

4

Надеюсь, это не то, что вам нужно делать часто.

DynamoDB не поддерживает запрос частичным хэш-ключом. Вам нужно будет использовать сканирование таблицы для повторения всех элементов таблицы и сравнить их для совпадений.

Это очень неэффективно, и если вы обнаружите, что в зависимости от этого типа поведения, вам нужно вернуться к выбору хэш-ключа и всех вариантов дизайна.

Для полноты код, который вы ищете, по следующим направлениям, если вы используете API документа:

// dynamo returns results in chunks - you'll need this to get the next one 
Map<String, AttributeValue> lastKeyEvaluated = null; 

do { 
    ScanRequest scanRequest = new ScanRequest() 
     .withTableName("YourTableNameHere") 
     .withExclusiveStartKey(lastKeyEvaluated); 

    ScanResult result = client.scan(scanRequest); 
    for (Map<String, AttributeValue> item : result.getItems()){ 
     // for each item in the result set, examine the partition key 
     // to determine if it's a match 
     string key = item.get("YourPartitionKeyAttributeNameHere").getS(); 
     if (key.startsWith("Mark")) 
      System.out.println("Found an item that matches *:Mark:\n" + item); 
    } 
    lastKeyEvaluated = result.getLastEvaluatedKey(); 
} while (lastKeyEvaluated != null); 

Но прежде чем реализовать что-то подобное в вашем приложении рассмотреть вариант другую стратегию ключа раздела или создание таблицы secondary index для вашей таблицы или и того и другого - если вам нужно часто задавать этот тип запроса!

В качестве побочного примечания, мне любопытно, какую выгоду вы получите, включая идентификатор пользователя и имя пользователя в разделе раздела? Идентификатор пользователя, по-видимому, был бы уникальным для вас, поэтому почему имя пользователя?

+0

Удивительное количество деталей Майк! Просто нужно добавить некоторую информацию о возможностях использования ключей диапазона, чтобы решить эту проблему, и мой ответ становится устаревшим ... – Krease

+0

Спасибо @Chris. Я более или менее сознательно пропустил детали ключа диапазона частично, потому что в этом случае он не (идентификатор пользователя и пары имен пользователей должны быть уникальными), а отчасти потому, что я считаю, что использование ключей дальности с динамомашиной легко пропустить и причина многих головных болей масштабирования –

0

Вы не можете сделать это, как описано выше экономичным способом. Вам понадобится scan стол, что дорого и требует много времени.

Повторите выбор ключа, чтобы всегда выполнялись запросы с полными значениями ключей вместо подстрок.

Возможно, вы захотите использовать ключ диапазона - при включении ключа диапазона запросы могут эффективно выполняться либо с помощью хеш-ключа (возвращающего потенциально несколько значений), либо комбинации клавиши хеша/диапазона (которая должна быть уникальный).

В этом примере, если вы всегда запрашивая на любом USERID: имя пользователя или имя пользователя (но не USERID сам по себе), а затем, используя имя пользователя в качестве хеш-ключа и USERID в качестве ключевой диапазон является простым и эффективным решением.

+0

Просто будьте осторожны с клавишами диапазона, потому что это открывает возможность неравномерного распределения ключей - т.е. несколько хеш-ключей с большим количеством клавиш диапазона, скорее всего, вызовут проблемы (см. http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.Partitions.Scaling и http: // docs.aws.amazon.com/amazondynamodb/latest/developerguide/BestPractices.html) –

Смежные вопросы