Лямбда-функция AWS для сканирования / запроса таблицы DynamoDB с использованием значений массива в качестве FilterExpression - PullRequest
0 голосов
/ 04 июля 2019

вот мой случай: я пытаюсь сделать запрос к таблице (имя таблицы HCI.LocCatApp), используя значение, отправленное API как KeyConditionExpression, и я сохраняю результаты (которые должны быть числами, а не строками) ) в массиве, и я хочу использовать каждое значение из этого массива как FilterExpression для сканирования другой таблицы (имя таблицы HCI.Category) .. Так что мне нужно, чтобы зациклить значения массива, принять каждое из них как FilterExpression и выполните операцию scan. В настоящее время я пытаюсь использовать IN, но я не уверен, поддерживается ли он вообще или нет. И имейте в виду, что массив заполняется во время выполнения. И callback может быть выполнен только один раз.

вот мой код:

'use strict'

var AWS = require('aws-sdk');
var mydocumentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = function (event, context, callback) {

    var params = {
        TableName: 'HCI.LocCatApp',
        KeyConditionExpression : 'LocID = :lid',
            ExpressionAttributeValues: {
            ":lid": event.LocID
        },
        ProjectionExpression: 'CatID'

    };
    var catIDs = [];
    var catIDsObject = {};
    var index = 0;

    mydocumentClient.query(params, function (err, data){
        if (err) {
            callback(err, null);
        }else{
          data.Items.forEach(function(item){catIDs.push(item.CatID)});
          //callback(null, catIDs);

        }
    })

    catIDs.forEach(function(value){
      index ++;
      var catIDsKey = ":catID"+index;
      catIDsObject[catIDsKey] = value;
    })


      var params2 = {
        TableName: 'HCI.Category',
        FilterExpression : "CatID IN (:cIDs)",
        ExpressionAttributeValues : {
          ':cIDs' : catIDs
        }

      };
      mydocumentClient.scan(params2, function (err, data){
        if (err) {
            callback(err, null);
        }else{
          callback(null, data);
        }
    })

}

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

1 Ответ

0 голосов
/ 04 июля 2019

В вашем коде catIds - это массив идентификаторов (вероятно, строк).

Когда вы передаете его в FilterExpression, вы предполагаете, что оно будет преобразовано в a) строку b) в строку вправильный формат.

FilterExpression : "CatID IN (:cIDs)",
        ExpressionAttributeValues : {
          ':cIDs' : catIDs
        }

В данный момент я не могу попробовать это сам, но я предполагаю, что это - то, где запрос терпит неудачу.Оператор IN ожидает, что список значений, разделенных запятыми, будет сравниваться в скобках.Итак, после того, как массив вставлен в запрос, он должен выглядеть примерно так:

FilterExpression : "CatID IN (cat1, cat2, cat2)",

Но, скорее всего, он содержит дополнительный набор [ и ], и, возможно, даже преобразование массива в строку вызывает егочто-то вроде [Object object] и т. д.

Одним из решений будет использование Array.join для объединения всех элементов массива в одну строку перед передачей его в FilterExperession.Как то так

 FilterExpression : "CatID IN (:cIDs)",
            ExpressionAttributeValues : {
              ':cIDs' : catIDs.join()
            }
...