DynamoDb Сканирование выражения фильтра с использованием NameMap для поиска атрибута JSON завершается неудачно (Java) - PullRequest
0 голосов
/ 23 марта 2019

Почему замена nameMap работает должным образом для ключа сортировки (skey), но не для вспомогательного значения атрибута JSON (jsonvalue.adminLevel)?

Моя таблица содержит этот элемент, где 'jsonvalue' хранится в формате JSON:

{ Item: {pkey=_ROOT_ADMIN, skey=admin, jsonvalue={name=adminName, userId=adminUid, hashedPass=adminHashedPass, adminLevel=0}} }

Это сканирование / фильтр успешно извлекает элемент (важна функция table.scan (), используя прямое имя атрибута и вспомогательное значение, закомментировано одно из значений nameMap):

public List<Admin> getAdminsByLevel(AdminLevel level) {
        NameMap nameMap = new NameMap()
            .with("#skey", "skey");
            // .with("#jsonvalue_adminLevel","jsonvalue.adminLevel");
        ValueMap valueMap = new ValueMap()
            .withString(":skey", Admins.ADMIN_SKEY)
            .withInt(":jsonvalue_adminLevel", level.getValue());
        ItemCollection<ScanOutcome> items = 
            this.ddb.table.scan("#skey = :skey AND jsonvalue.adminLevel = :jsonvalue_adminLevel", nameMap, valueMap);
        Iterator<Item> iter = items.iterator();
        List<Admin> list = new ArrayList<Admin>();
        while (iter.hasNext()) {
            Item item = iter.next();
            Admin admin = DtoUtils.toAdmin(item);
            list.add(admin);
        }
        return list;
    }

Но это сканирование / фильтр (где jsonvalue.adminLevel заменяется сопоставленным именем #jsonvalue_adminLevel) не вызывает ошибки, но также не возвращает элемент:

public List<Admin> getAdminsByLevel(AdminLevel level) {
        NameMap nameMap = new NameMap()
            .with("#skey", "skey")
            .with("#jsonvalue_adminLevel","jsonvalue.adminLevel");
        ValueMap valueMap = new ValueMap()
            .withString(":skey", Admins.ADMIN_SKEY)
            .withInt(":jsonvalue_adminLevel", level.getValue());
        ItemCollection<ScanOutcome> items = 
            this.ddb.table.scan("#skey = :skey AND #jsonvalue_adminLevel = :jsonvalue_adminLevel", nameMap, valueMap);
        Iterator<Item> iter = items.iterator();
        List<Admin> list = new ArrayList<Admin>();
        while (iter.hasNext()) {
            Item item = iter.next();
            Admin admin = DtoUtils.toAdmin(item);
            list.add(admin);
        }
        return list;
    }

Почему замена nameMap работает должным образом для ключа сортировки (skey), но не для вспомогательного значения атрибута JSON (jsonvalue.adminLevel)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...