Использование фильтра содержит в DynamoDB scan с Java

Предположим, у меня есть рабочий запрос, такой как:

ScanRequest scanRequest = new ScanRequest()
            .withTableName("myTable")
            .withFilterExpression("attr1 = :val1 and attr2 = :val2")
            .withExpressionAttributeValues(vm)  //contains values for :val1 and :val2
            .withLimit(PAGE_SIZE)
            .withConsistentRead(READ_TYPE);

теперь я хотел бы расширить этот скан. Предположим, что моя таблица также имеет атрибут attr3, который имеет форму:

"attr3": {
    "S": "AAA BBB CCC DDD"
}

Как я могу фильтровать элементы, которые attr3 содержит AAA? Или AAA и BBB?

1 ответов


В В DynamoDB условные выражения справочная документация - ваш друг!

в вашем конкретном случае вы можете использовать содержит функция для поиска подстроки. Выражение фильтра может выглядеть примерно так:

"attr1 = :val1 and attr2 = :val2 and (contains(attr3, :val3a) or contains(attr3, :val3b))"             
// where :val3a and :val3b are value placeholders for say AAA and BBB

но я подозреваю, что то, что вы хотите достичь, немного сложнее, чем может быть обработано на стороне сервера фильтрами DynamoDB, поэтому у вас есть два варианта:

  1. сделать фильтрацию в логика приложения (т. е. опусти свой ... результаты клиенту и фильтр там), или;
  2. изменить атрибут из строки в список или набор строк (если дубликаты не разрешены)

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