2014-02-07 2 views
4

Я использую DynamoDBMapper для класса, скажем, «Пользователь» (имя пользователя - первичный ключ), на котором есть поле, в котором указано «Статус». Это таблица ключей Hash + Range, и каждый раз, когда изменяется статус пользователя (изменения происходят крайне редко), мы добавляем новую запись в таблицу вместе с меткой времени (которая является ключом диапазона). Чтобы извлечь текущее состояние, это то, что я делаю:Предложение DynamoDB withLimit с DynamoDBMapper.query

DynamoDBQueryExpression expr = 
     new DynamoDBQueryExpression(new AttributeValue().withS(userName)) 
       .withScanIndexForward(false).withLimit(1); 

    PaginatedQueryList<User> result = 
       this.getMapper().query(User.class, expr); 

    if(result == null || result.size() == 0) { 
     return null; 
    } 

    for(final User user : result) { 
     System.out.println(user.getStatus()); 
    } 

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

Однако, когда я даже смотреть на проволочных журналы одного и того же, я вижу огромное количество записей, возвращаемых, гораздо больше, чем 1. В настоящее время, я использую:

final String currentStatus = result.get(0).getStatus(); 

Что я пытаясь понять здесь, что это за пункт withLimit в этом случае, или я делаю что-то неправильно?

ответ

6

В марте 2013 года на AWS forums пользователь пожаловался на ту же проблему.

Представитель Amazon отправил его для использования функции queryPage.

Кажется, что предел не сохраняется для элементов, а является ограничением на кусок элементов, полученных в одном вызове API, и может помочь запросPage.

Вы также можете посмотреть в pagination loading strategy configuration

Кроме того, вы всегда можете open a Github issue для команды.

-1

Я недавно наткнулся на эту проблему, и я обнаружил, что withLimit не имеет смысла, он используется для ограничения количества результатов на странице. Используйте следующие шаги, чтобы получить ограниченный набор результатов:

  1. Создать DynamoDBQueryExpression QueryExpression withLimit (SOME_NUMBER);
  2. Используйте queryPage, чтобы получить одну страницу:

    QueryResultPage<T> page = dynamoDBMapper.queryPage(T.class, queryExpression);

  3. Используйте page.getResults(), чтобы получить список результатов.

Всё.

См. Официальную документацию на withLimit (см. Примечание) для уточнения: http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBQueryExpression.html#withLimit(java.lang.Integer)

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