Node.js DynamoDB Nodejs-使用字符串数组查询列

Node.js DynamoDB Nodejs-使用字符串数组查询列,node.js,amazon-dynamodb,Node.js,Amazon Dynamodb,我在DynamoDB的一个表中有两列:流派和艺术家(都是字符串数组)。编写lambda函数以从此表中获取数据。此lambda函数的输入是类型(字符串数组-它是“类型”列中值的子集)和艺术家(字符串数组,它是“艺术家”列中值的子集) 现在,我尝试使用FilterExpression构造一个查询,该查询返回所有列,这些列在“类型输入数组”的“类型”列或“艺术家输入数组”的“艺术家”列中至少有一个值。基本上,每个列中两个数组中至少有一个字符串的任何匹配 这就是我尝试过的 if (genres !=

我在DynamoDB的一个表中有两列:流派和艺术家(都是字符串数组)。编写lambda函数以从此表中获取数据。此lambda函数的输入是类型(字符串数组-它是“类型”列中值的子集)和艺术家(字符串数组,它是“艺术家”列中值的子集)

现在,我尝试使用FilterExpression构造一个查询,该查询返回所有列,这些列在“类型输入数组”的“类型”列或“艺术家输入数组”的“艺术家”列中至少有一个值。基本上,每个列中两个数组中至少有一个字符串的任何匹配

这就是我尝试过的

 if (genres != null) {
            
            var genreArray = genres.split(",");

            var genresKeyObject = {};

            genreArray.forEach(function(value) {
                index++;
                var genreKey = ":genreValue" + index;
                expression_attributes[genreKey.toString()] = value;
                genresKeyObject[genreKey.toString()] = value;
            });

            filter_expression = filter_expression + " genres IN (" + Object.keys(genresKeyObject).toString() + ")";
        }


下面是我的FilterExpression和ExpressionAttribute值的示例:

var params = {
            TableName: dynamodbTableName,
            IndexName: 'MonthYearIndex',
            KeyConditionExpression: "month_year = :month_year",
            FilterExpression: filter_expression,
            ExpressionAttributeValues: expression_attributes
        };

filter_expression : (artists IN (:artistValue1) OR genres IN (:genreValue2)) AND host_publisher_id = :host_pid
expression_attributes: {
    ":month_year": "2020-09",
    ":host_pid": "21",
    ":artistValue1": "Midwestern rockers",
    ":genreValue2": "Rock and Pop"
}


const data = await docClient.query(params).promise();

上面的查询只返回1条记录,我可以看到,对于这个FilterExpression,db中有多条记录。我正在尝试获取与此查询匹配的所有记录


基本上,我应该使用“Contains”而不是“IN”

下面是我如何构造filterexpression和ExpressionAttributeValue的

 var filter_expression = "";
        var expression_attributes = { ":month_year": month_year, ":host_pid": publisher_id };

        var index = 0;

        if (tags) {

            filter_expression = filter_expression + "(";

            var tagArray = tags.split(",");

            tagArray.forEach(function(value) {
                index++;
                var tagKey = ":tagValue" + index;
                expression_attributes[tagKey.toString()] = value;
                filter_expression = filter_expression + "contains (tags, " + tagKey + ") OR ";
            });

            filter_expression = filter_expression.trim();
            if (filter_expression.endsWith("OR")) {
                filter_expression = filter_expression.substring(0, filter_expression.length - 2).trim();
            }

            filter_expression = filter_expression + ")";
            filter_expression = filter_expression + " AND ";
        }

        if (DEBUG)
            console.log("FilterExpression after Tags : " + filter_expression);



        if (artists) {

            filter_expression = filter_expression + "(";

            var artistArray = artists.split(",");

            artistArray.forEach(function(value) {
                index++;
                var artistKey = ":artistValue" + index;
                expression_attributes[artistKey.toString()] = value;
                filter_expression = filter_expression + "contains (artists, " + artistKey + ") OR ";
            });

            filter_expression = filter_expression.trim();
            if (filter_expression.endsWith("OR")) {
                filter_expression = filter_expression.substring(0, filter_expression.length - 2).trim();
            }

            filter_expression = filter_expression + ")";
            filter_expression = filter_expression + " AND ";
        }

        if (DEBUG)
            console.log("FilterExpression after Artists : " + filter_expression);



        if (genres) {

            filter_expression = filter_expression + "(";

            var genreArray = genres.split(",");

            genreArray.forEach(function(value) {
                index++;
                var genreKey = ":genreValue" + index;
                expression_attributes[genreKey.toString()] = value;
                filter_expression = filter_expression + "contains (genres, " + genreKey + ") OR ";
            });

            filter_expression = filter_expression.trim();
            if (filter_expression.endsWith("OR")) {
                filter_expression = filter_expression.substring(0, filter_expression.length - 2).trim();
            }

            filter_expression = filter_expression + ")";
        }

        if (DEBUG)
            console.log("FilterExpression after Genres : " + filter_expression);

        filter_expression = filter_expression.trim();
        if (filter_expression.endsWith(" AND")) {
            filter_expression = filter_expression.substring(0, filter_expression.length - 3).trim();
        }

        if (filter_expression == "")
            filter_expression = "host_publisher_id = :host_pid";
        else
            filter_expression = filter_expression + " AND host_publisher_id = :host_pid";

        if (DEBUG) {
            console.log("Final FilterExpression : " + filter_expression);
            console.log("Final ExpressionAttributes: " + JSON.stringify(expression_attributes));
        }
        

我指的是这个--用问答来写语法和查询