如何在 DynamoDB 中的单个属性上查询(getItems)两个条件(不存在 + 某个值)?

Posted

技术标签:

【中文标题】如何在 DynamoDB 中的单个属性上查询(getItems)两个条件(不存在 + 某个值)?【英文标题】:How to query(getItems) for two conditions (non-existent + some value) on single attribute in DynamoDB? 【发布时间】:2020-05-12 21:41:17 【问题描述】:

我正在尝试在 DynamoDB 表上查询 (getItems) 以查找尚未设置 InitiateMQFlag = 0 或“InitiateMQFlag”属性的所有项目。包含 InitiateMQFlag 字段的表上存在一个名为 BLEAdvertisement-InitiateMQFlag-index 的全局二级索引。我曾使用过 FilterExpression: "attribute_not_exists(InitiateMQFlag)" 但它会引发错误。

var params = 
        TableName: device_table,
        IndexName: "BLEAdvertisement-InitiateMQFlag-index",
        KeyConditionExpression: "BLEAdvertisement = :BLEAdvertisement AND InitiateMQFlag = :InitiateMQFlag",
        ExpressionAttributeValues: 
          ':BLEAdvertisement': BLEAdvertisements[i],
          ':InitiateMQFlag' : InitiateMQFlagValue
        ,
        FilterExpression: "attribute_not_exists(InitiateMQFlag)"
      ;

结果:


code:"ValidationException"
message:"Filter Expression can only contain non-primary key attributes: Primary key attribute: InitiateMQFlag"
name:"ValidationException"
requestId:"OVIAPBSCAAU42OI41LQUSGIU7JVV4KQNSO5AEMVJF66Q9ASUAAJG"
retryable:false
retryDelay:3.1105465830200685
statusCode:400

如果有另一种方法可以通过对单个属性的另一个查询来获取不存在的属性,那也会有很大帮助。

【问题讨论】:

【参考方案1】:

FilterExpression 用于在从分区中读取结果后相对低效地过滤掉结果 - 您将在过滤发生之前为读取付费。 DynamoDB 拒绝允许您过滤 主键(分区键或排序键)以提示您有更有效的方法来执行此操作:您应该改用 KeyConditionExpression

而且,在您的情况下,您确实在键列 InitiateMQFlag 上执行KeyConditionExpression。因此,除了不允许在此列上进行过滤这一事实之外,您为什么还要这样做呢?鉴于KeyConditionExpression 已经将查询限制为仅对 InitiateMQFlag = :InitiateMQFlag 的项目 - 它如何匹配 attribute_not_exists(InitiateMQFlag) 过滤器?

【讨论】:

以上是关于如何在 DynamoDB 中的单个属性上查询(getItems)两个条件(不存在 + 某个值)?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过单个查询跟踪 DynamoDB 表中的最小值/最大值?

如何按日期(范围键)查询 DynamoDB,没有明显的哈希键?

如何在 DynamoDB 中查询不存在的(空)属性

DynamoDB如何查询具有强一致性的非键属性?

DynamoDB - 如何计算查询的读取吞吐量

如何从 Java 中的 DynamoDB getItem 中获取特定属性值