是否可以使用数组[apple, orange]
查询类别(也是数组。显示如下)并获取数据包含apple
或orange
的值?
row1 | "category": [apple, orange, banana, watermelon]
row2 | "category": [banana, watermelon]
row3 | "category": [orange, watermelon]
我希望得到row1, row3
,其中包含apple
或orange
。
答案 0 :(得分:5)
您可以使用 CONTAINS 功能检查列表中的值。但是,如果要检查多个值,则需要对每个值使用逻辑OR条件。
列表支持CONTAINS:评估" a CONTAINS b"," a" 可以是一个清单;然而," b"不能是集合,地图或列表。
示例: - 强>
var params = {
TableName : 'tableName',
FilterExpression: "contains (category, :category1) OR contains (category, :category2)",
ExpressionAttributeValues : {
':category1' : "apple",
':category2' : "orange"
}
};
注意: - 强>
我假设你要使用Scan API。如果您使用的是查询API,请添加KeyConditionExpression
。
答案 1 :(得分:0)
该问题询问了Query
,但似乎还不清楚是否在Scan
上使用了该技术。我将为每个部分回答。
Scan
非常昂贵,应尽可能使用Query
。 Scan
轻松支持使用contains
来完成您要求的操作。
await db.scan({
TableName : 'tableName',
FilterExpression: "contains (category, :category1) OR contains (category, :category2)",
ExpressionAttributeValues : {
':category1' : "apple",
':category2' : "orange"
}
}).promise();
鉴于Scan效率低下,最好有一个策略,其中可以使用Query
返回表中的行。 Query
不不支持Contains
语法,并且必须仅运行单个HASH
值。具有不同HASH
值的两个不同行不能在同一Query
中返回。假设满足此条件,则需要构建自定义索引。有两种方法可以执行此操作,具体取决于您拥有的类别数以及是否可以分配多个类别以到达行。每行1个猫,一个索引列即可工作。否则,我们将需要构造一个索引列以使用其他运算符之一。
该列将需要为该行的所有类别包含一个复合值,例如对于所有可能的类别都为f(column_value, category_value_check) = true
。为了构造这样的复合值,Amazon建议使用Z-Index。