AWS Lambda函数使用数组值作为FilterExpression

时间:2019-07-04 09:29:33

标签: amazon-web-services aws-lambda amazon-dynamodb

这是我的情况:我正在尝试使用API​​作为HCI.LocCatApp发送的值在表(表名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 :(得分:0)

在您的代码catIds中是一个ID数组(可能是字符串)。

当您将其传递给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()
            }