繁体   English   中英

DynamoDB Nodejs - 查询带有字符串数组的列

[英]DynamoDB Nodejs - Query a column with array of strings

我在 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 和 ExpressionAttributes 值的示例:

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 条记录,我可以看到在 db 中有多个记录用于这个 FilterExpression。 我正在尝试获取与此查询匹配的所有记录。

在此处输入图片说明

基本上我应该使用“包含”而不是“IN”

这是我如何构造 filterexpression 和 expressionattributevalues

 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));
        }
        

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM