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