amazon-web-services - DynamoDB 等效于 SQL 的键或属性“不在(“value1”,“value2”...)”
问题描述
我正在尝试使用 aws-sdk 模块中的 AWS.DynamoDB.DocumentClient 运行一些 dynamoDB 操作,但我无法找到一个简单的解决方案来选择属性不等于值数组的项目。
例如 属性 <> ["value1", "value2]
这相当于一个简单的典型 SQL 操作,形式为:
select * from sometable where attribute not in("value1", "value2"...);
在按照此处的文档尝试不同的 ScanFilter 和 QueryFilter 之后,NE 和 NOT_CONTAINS 的 AttributeValueList 似乎不接受多个值。
我已经找到了这个解决方案,但它看起来很笨拙,我必须编写逻辑来创建过滤条件字符串和 ExpressionAttributeValues,因为过滤条件是动态的。
FilterExpression: 'answer <> :answer1 AND answer <> :answer2',
ExpressionAttributeValues : {
':answer1' : "test1",
':answer2' : "test2"
}
因此,我有两个问题:
- 有没有更好的方法来做到这一点?
- KeyConditionExpression 的字符串有长度限制吗?我很确定有,但我似乎找不到这方面的信息。
解决方案
- 没有其他方法可以实现您所需要的。如果所有这些值都有共同点,并且您在写入时就知道了,您可以使用某种前缀插入它们并创建 GSI,它们将作为排序键。在这种情况下,您将能够通过键条件表达式中的前缀查询它们。否则,您的建议是您唯一的选择。
- 所有表达式组合的大小为 4KB。如表达式参数中所述:
表达式参数包括 ProjectionExpression、ConditionExpression、UpdateExpression 和 FilterExpression。
任何表达式字符串的最大长度为 4 KB。例如,ConditionExpression a=b 的大小是 3 个字节。