DynamoDB:开头不是

时间:2019-04-29 20:20:07

标签: amazon-web-services amazon-dynamodb

我正在尝试运行一个DynamoDB查询,该查询说我想要不是以特定值开头的项目。我似乎找不到办法。

我尝试了以下4种评估方式,但没有一种有效。每个人都会给我一个无效的操作员错误。

我尝试的

我的 KeyConditionExpression 如下:

!begins_with(gameScoreId, :scoreScore) AND !begins_with(gameScoreId, :scoreLevel) AND userId = :userId

<>begins_with(gameScoreId, :scoreScore) AND <>begins_with(gameScoreId, :scoreLevel) AND userId = :userId

NOT begins_with(gameScoreId, :scoreScore) AND NOT begins_with(gameScoreId, :scoreLevel) AND userId = :userId

begins_with(gameScoreId, :scoreScore) = false AND begins_with(gameScoreId, :scoreLevel) = false AND userId = :userId

如果删除not运算符,则会出现此错误:

  

KeyConditionExpressions每个键只能包含一个条件

在dynamodb中有办法吗?

2 个答案:

答案 0 :(得分:0)

看起来关键条件表达式不支持NOT begins_with(x)。这可能是因为结果集不连续(是x之前的项目,与x之后的项目汇总)。

一些可能的解决方案是:

  1. gameScoreId设置为非关键属性(或将其复制到新的非关键属性中),然后可以在userId上进行查询,并在gameScoreId上进行过滤(您可以无法过滤关键属性),或者
  2. 扫描表,在这种情况下,您可以应用要使用的过滤器表达式(显然,非常大的表会带来性能问题)

答案 1 :(得分:0)

        .withFilterExpression("NOT begins_with(hashKey, :hKey)")
        .withExpressionAttributeValues(ImmutableMap.of(
                ":hKey", new AttributeValue().withS("somePrefix:")))

使用过滤器表达式时,这似乎对我有用。我认为您的问题更多是在一键上使用更多条件。