首页 > 解决方案 > 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 似乎不接受多个值。

我希望得到如下所示的结果,而不必定义多个“AND”查询 在此处输入图像描述

我已经找到了这个解决方案,但它看起来很笨拙,我必须编写逻辑来创建过滤条件字符串和 ExpressionAttributeValues,因为过滤条件是动态的。

FilterExpression: 'answer <> :answer1 AND answer <> :answer2',
        ExpressionAttributeValues : {
            ':answer1' : "test1",
            ':answer2' : "test2"
        }

因此,我有两个问题:

  1. 有没有更好的方法来做到这一点?
  2. KeyConditionExpression 的字符串有长度限制吗?我很确定有,但我似乎找不到这方面的信息。

标签: amazon-web-servicesamazon-dynamodbaws-sdkdynamodb-queries

解决方案


  1. 没有其他方法可以实现您所需要的。如果所有这些值都有共同点,并且您在写入时就知道了,您可以使用某种前缀插入它们并创建 GSI,它们将作为排序键。在这种情况下,您将能够通过键条件表达式中的前缀查询它们。否则,您的建议是您唯一的选择。
  2. 所有表达式组合的大小为 4KB。如表达式参数中所述:

表达式参数包括 ProjectionExpression、ConditionExpression、UpdateExpression 和 FilterExpression。

任何表达式字符串的最大长度为 4 KB。例如,ConditionExpression a=b 的大小是 3 个字节。


推荐阅读