按字符串数组搜索 DynamoDB 字符串集属性
Searching a DynamoDB String Set Attribute by Array of Strings
我正在努力寻找正确的语法来通过字符串数组搜索字符串 Set/List 目标属性(标签)。这个想法是,如果 SS 属性包含传递的字符串的 all,它就会通过过滤器。传递的字符串不需要匹配目标属性中的所有字符串。您传递的字符串越多,您的结果就越准确。
// Compile tags into a list
let tagSqlValues = {};
let tagSqlStatement = query.tags.map((tag: string, index: number) => {
let tagParam = `:tag${index}`;
tagSqlValues[tagParam] = tag;
return `${tagParam} in tags`;
}).join(" and ");
// Console Logs
// tagSqlStatement = :tag0 in tags and :tag1 in tags (also tried tags contains :tag0 and tags contains :tag1)
// tagSqlValues = {":tag0":"Modern",":tag1":" Spring"}
let params = {
TableName: "Art",
FilterExpression: tagSqlStatement,
ExpressionAttributeValues: tagSqlValues,
};
let results = await this.DDB_CLIENT.scan(params).promise();
// Console Logs
// "Invalid FilterExpression: Syntax error; token: \"tags\", near: \"in tags and\""
// "Invalid FilterExpression: Syntax error; token: \"contains\", near: \"tags contains :tag0\""
我尝试了 IN 和 CONTAINS 的几种变体,但都没有成功。这对 DynamoDB 可行吗?
看来我的 CONTAINS 语法有误。我做了一点挖掘,发现了 Zanon 的 。稍作修改以包含 and 连接,过滤器似乎按预期工作!
// Compile tags into a list
let tagSqlValues = {};
let tagSqlStatement = query.tags.map((tag: string, index: number) => {
let tagParam = `:tag${index}`;
tagSqlValues[tagParam] = tag;
return `contains(tags, ${tagParam})`;
}).join(" and ");
我正在努力寻找正确的语法来通过字符串数组搜索字符串 Set/List 目标属性(标签)。这个想法是,如果 SS 属性包含传递的字符串的 all,它就会通过过滤器。传递的字符串不需要匹配目标属性中的所有字符串。您传递的字符串越多,您的结果就越准确。
// Compile tags into a list
let tagSqlValues = {};
let tagSqlStatement = query.tags.map((tag: string, index: number) => {
let tagParam = `:tag${index}`;
tagSqlValues[tagParam] = tag;
return `${tagParam} in tags`;
}).join(" and ");
// Console Logs
// tagSqlStatement = :tag0 in tags and :tag1 in tags (also tried tags contains :tag0 and tags contains :tag1)
// tagSqlValues = {":tag0":"Modern",":tag1":" Spring"}
let params = {
TableName: "Art",
FilterExpression: tagSqlStatement,
ExpressionAttributeValues: tagSqlValues,
};
let results = await this.DDB_CLIENT.scan(params).promise();
// Console Logs
// "Invalid FilterExpression: Syntax error; token: \"tags\", near: \"in tags and\""
// "Invalid FilterExpression: Syntax error; token: \"contains\", near: \"tags contains :tag0\""
我尝试了 IN 和 CONTAINS 的几种变体,但都没有成功。这对 DynamoDB 可行吗?
看来我的 CONTAINS 语法有误。我做了一点挖掘,发现了 Zanon 的
// Compile tags into a list
let tagSqlValues = {};
let tagSqlStatement = query.tags.map((tag: string, index: number) => {
let tagParam = `:tag${index}`;
tagSqlValues[tagParam] = tag;
return `contains(tags, ${tagParam})`;
}).join(" and ");