簡體   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