2016-09-19 3 views
0

Я пытаюсь запросить таблицу DynamoDB с использованием фильтра IN. Мой запрос работает, когда я передаю одно значение IN, но когда я передаю несколько, я не получаю совпадений.Фильтр запроса DynamoDB с использованием IN

Вот начальная настройка объекта params.

var params = { 
    TableName: "Interactions", 
    IndexName: "environment-time-index", 
    KeyConditionExpression: "#environment = :environment and #time between :start and :end", 
    FilterExpression: "#product = :product", 
    ExpressionAttributeNames: { 
     "#product": "product", 
     "#environment": "environment", 
     "#time": "time" 
    }, 
    ExpressionAttributeValues: { 
     ":product": product,  
     ":environment": environment, 
     ":start": start, 
     ":end": end 
    } 
    }; 

Далее, если пользователь поставляет параметр твердого запроса, я изменяю объект params, например. Здесь я использую оператор IN.

if (req.query.firm) { 
    var firms = req.query.firm; 
    console.log('debug', firms); 
    params.FilterExpression += " AND #firmCode IN (:firms)"; 
    params.ExpressionAttributeNames["#firmCode"] = "firmCode"; 
    params.ExpressionAttributeValues[":firms"] = firms; 
    } 

Наконец, я запускаю запрос, например.

docClient.query(params, function(err, data) { 
    if (err) { 
     log.error(`Unable to scan. Error: ${JSON.stringify(err, null, 2)}`); 
     res.status(500).json({ error: "Oh, snap!" }); 
    } else { 
     data.Parameters = params.ExpressionAttributeValues; 
     log.info(`Scan succeeded. Received ${data.Count} items.`) 
     res.send(data); 
    } 
    }); 

Когда параметр фирмы содержит одно значение, я возвращаю результаты.

Level="INFO", Date="2016-09-19 14:26:03,373", Message="batchinsight received GET for /api/history/interactions2", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 
debug TW7ZN 
Level="INFO", Date="2016-09-19 14:26:03,623", Message="Scan succeeded. Received 19 items.", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 

Но когда он содержит несколько значений, я не получаю никаких результатов.

Level="INFO", Date="2016-09-19 14:35:16,896", Message="batchinsight received GET for /api/history/interactions2", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 
debug TW7ZN,TEXK4 
Level="INFO", Date="2016-09-19 14:35:16,991", Message="Scan succeeded. Received 0 items.", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 

документация DynamoDB предлагает оператор IN может принимать через запятую список значений, но я не могу заставить его работать. Пожалуйста помоги! http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html#ConditionExpressionReference

ответ

1

Фактически вы ссылаетесь на ссылочный документ ConditionExpression, который отличается от FilterExpression.

Выражение условия представляет собой ограничения для ввода, когда вы читаете (пожалуйста, не путайте это с запросом/сканированием) и пишите элементы в таблице.

Вы действительно запрашиваете таблицу. FilterExpression используется для запросов и сканирования данных.

IN: Проверяет соответствие элементов в двух наборах. AttributeValueList может содержать один или несколько элементов AttributeValue типа String, Номер или двоичный код (не установленный тип). Эти атрибуты сравниваются с существующим атрибутом типа набора элемента. Если какие-либо элементы из входного набора присутствуют в атрибуте item, выражение оценивает значение true.

Обратите внимание, что IN используется для проверки наличия единственного значения в типе данных SET.

Вы можете ссылаться на аналогичное сообщение here, где условие OR используется для сравнения нескольких значений в типе данных SET.

Аналогичным образом, если firmCode является типом STRING или SET, вы должны использовать ИЛИ условие.