2016-03-22 2 views
4

У меня есть таблица, которая содержит поле (не является ключевым полем) под названием appsMap, и это выглядит следующим образом:dynamodb - сканировать предметы, где карта содержит ключ

appsMap = { "qa-app": "abc", "another-app": "xyz" } 

Я хочу сканировать все строки, appsMap содержит ключ «qa-app» (значение не важно, просто ключ). Я пробовал что-то вроде этого, но он не работает так, как мне нужно:

FilterExpression = '#appsMap.#app <> :v', 
    ExpressionAttributeNames = { 
     "#app": "qa-app", 
     "#appsMap": "appsMap" 
    }, 
    ExpressionAttributeValues = { 
     ":v": { "NULL": True } 
    }, 
    ProjectionExpression = "deviceID" 

Какой правильный синтаксис?

Спасибо.

ответ

0

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

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

Вы можете посмотреть на создание GSI в таблице, если это запрос, который вы ожидаете запускать часто.

1

Существует дискуссия на эту тему здесь: https://forums.aws.amazon.com/thread.jspa?threadID=164470

Вы можете упустить эту часть из примера: ExpressionAttributeValues: { ": имя": { "S": "Джефф"}}

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

В отличие от других баз данных, вы должны выполнить множество настроек с помощью Dynamo, чтобы заставить его выполнять на своем высоком уровне, вот предложение: 1) Преобразуйте это в значение root, например добавьте в root: qaExist, с возможными значениями 0 | 1 или true | false. 2) Создайте вторичный индекс для вновь созданного значения. 3) Сделайте запрос по новому индексу, указав 0 в качестве параметра поиска.

Это сделает вашу систему очень быстрой и очень масштабируемой, независимо от того, сколько записей вы получите там позже.

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