2017-01-10 5 views
1

Мне нужно получить данные из DynamoDB с помощью идентификаторов пользователя, для этого я хочу использовать условие IN, но я не могу найти инструкцию, как это использовать, можете ли вы мне помочь? У меня есть код, как заменить userId = :id1 OR userId = :id2 на userId IN :ids? Как установить userIds в :ids?Как я могу использовать условие IN для DynamoDB

public List<Data> getByUserIds(List<Long> userIds) { 
    Table table = dynamoDB.getTable(getTableName()); 
    ScanSpec scanSpec = new ScanSpec() 
      .withFilterExpression("userId = :id1 OR userId = :id2") 
      .withValueMap(new ValueMap() 
        .withNumber(":id1", userIds.get(0)) 
        .withNumber(":id2", userIds.get(1)) 
      ); 
    ItemCollection<ScanOutcome> scanOutcome = table.scan(scanSpec); 
    return convertItemToData(scanOutcome.iterator()); 
} 

Спасибо!

ответ

1

Я сделал это, но он выглядит плохо, может быть, кто-нибудь знает , как сделать его лучше?

public List<HistoricalData> getByUserIdAndLocation(List<Long> userIds) { 
    Table table = dynamoDB.getTable(getTableName()); 
    ScanSpec scanSpec = new ScanSpec() 
      .withFilterExpression("userId IN (" + buildInFilterExpression(userIds) + ")") 
      .withValueMap(
        buildValueMap(userIds) 
      ); 
    ItemCollection<ScanOutcome> scanOutcome = table.scan(scanSpec); 
    return convertItemToHistoricalData(scanOutcome.iterator()); 
} 

private String buildInFilterExpression(List<Long> userIds) { 
    StringBuilder builder = new StringBuilder(); 
    for (Long id : userIds) { 
     builder.append(":user" + id + ","); 
    } 
    return builder.toString().substring(0, builder.length() - 1); 
} 

private ValueMap buildValueMap(List<Long> userIds) { 
    ValueMap valueMap = new ValueMap(); 
    for (Long id : userIds) { 
     valueMap.withNumber(":user" + id, id); 
    } 
    return valueMap; 
} 

Я думаю, что нужно использовать valueMap.withList вместо valueMap.withNumber но он не работает для меня ...

0

Вы можете использовать BatchGetItem API для извлечения обоих пользователей в одном запросе.

+0

не решить мою проблему, потому что я могу иметь 1..10 ... 100 условие 'IN' и с' BatchGetIItem' будет выглядеть плохо –