Как применять фильтры в DynamodB GetItem - PullRequest
0 голосов
/ 31 октября 2019

Я хочу получить конкретный элемент из dynamoDB, используя table.getItem(xxx), и при получении элемента необходимо применить несколько фильтров.

select * from emp where empid=1 and isadmin=true;

Как мне написать приведенный выше запрос в Dynamo-DB.

Ниже приведен пример кода, который я пробовал:

GetItemSpec spec = new GetItemSpec()
.withPrimaryKey("empid", "1", "deptno", "12");
 Item outcome = table.getItem(spec);
  System.out.pritnln("outcome "+outcome);

В приведенном выше коде я хочу применить еще один фильтр, например "isAdminU = true", пожалуйста, дайте мне несколько советов по добавлению фильтров в getItem (....).

Примечание:

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

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Как вы заметили, операция GetItem в DynamoDB не принимает фильтр. Он всегда возвращает один элемент, если он существует, поэтому часто нет необходимости в такой фильтрации. Но если вы действительно хотите такую ​​фильтрацию - например, ваши элементы имеют большой размер и вы не хотите тратить пропускную способность сети на их отправку, если они не проходят ваш фильтр - как вы сами предложили, вы можете использовать Query.

Да, формат ответа Query немного отличается от GetItem, но любая библиотека DynamoDB на любом языке делает получение первого (и единственного) элемента в ответе тривиальным. Если вас беспокоит возможность получить больше, чем первый элемент, вы всегда можете установить Limit=1, но в этом нет необходимости, если ваше ключевое условие гарантирует, что только один элемент будет соответствовать.

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

0 голосов
/ 31 октября 2019

Вы не можете указать фильтр в вызове API GetItem в DynamoDB.

Он просто поддерживает проекцию, например:

GetItemSpec spec = new GetItemSpec()
    .withPrimaryKey("Id", 206)
    .withProjectionExpression("Id, Title, RelatedItems[0], Reviews.FiveStar")
    .withConsistentRead(true);

Однако есть API-интерфейс QuerySpec,который может быть использован для получения элемента с условием фильтра в DynamoDB.

 Table table = dynamoDB.getTable("test");

        QuerySpec spec = new QuerySpec()
                .withKeyConditionExpression("apartId = :v_id")
                .withFilterExpression("apartName = :apartName")
                .withValueMap(new ValueMap()
                        .withString(":v_id", "123")
                        .withString(":apartName", "somewhere")
                        );

        ItemCollection<QueryOutcome> items = table.query(spec);

        Iterator<Item> iterator = items.iterator();
        Item item = null;
        while (iterator.hasNext()) {
            item = iterator.next();
            System.out.println(item.toJSONPretty());
        } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...