如何在 DynamoDB 中的单个属性上查询(getItems)两个条件(不存在+某个值)?
How to query(getItems) for two conditions (non-existent + some value) on single attribute in DynamoDB?
我正在尝试在 DynamoDB table 上查询 (getItems) 以查找尚未设置 InitiateMQFlag = 0 或 'InitiateMQFlag' 属性的所有项目。 table 上存在一个名为 BLEAdvertisement-InitiateMQFlag-index 的全局二级索引,其中包括 InitiateMQFlag 字段。我使用过 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
如果有另一种方法可以通过对单个属性的另一个查询来获取不存在的属性,这也会有很大帮助。
A FilterExpression
用于在已经从分区中读取结果后相对低效地过滤掉结果 - 您将在过滤发生之前为读取付费。 DynamoDB 拒绝让您过滤 主键 (分区键或排序键)以提示您有更有效的方法来执行此操作:您应该使用 KeyConditionExpression
代替。
并且,在您的情况下,您确实在键列 InitiateMQFlag 上执行了 KeyConditionExpression
。因此,除了不允许在此列上进行过滤这一事实之外,您为什么还要这样做呢?鉴于 KeyConditionExpression
已经将查询仅限于 InitiateMQFlag = :InitiateMQFlag 的项目 - 它怎么能匹配 attribute_not_exists(InitiateMQFlag) 过滤器?
我正在尝试在 DynamoDB table 上查询 (getItems) 以查找尚未设置 InitiateMQFlag = 0 或 'InitiateMQFlag' 属性的所有项目。 table 上存在一个名为 BLEAdvertisement-InitiateMQFlag-index 的全局二级索引,其中包括 InitiateMQFlag 字段。我使用过 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
如果有另一种方法可以通过对单个属性的另一个查询来获取不存在的属性,这也会有很大帮助。
A FilterExpression
用于在已经从分区中读取结果后相对低效地过滤掉结果 - 您将在过滤发生之前为读取付费。 DynamoDB 拒绝让您过滤 主键 (分区键或排序键)以提示您有更有效的方法来执行此操作:您应该使用 KeyConditionExpression
代替。
并且,在您的情况下,您确实在键列 InitiateMQFlag 上执行了 KeyConditionExpression
。因此,除了不允许在此列上进行过滤这一事实之外,您为什么还要这样做呢?鉴于 KeyConditionExpression
已经将查询仅限于 InitiateMQFlag = :InitiateMQFlag 的项目 - 它怎么能匹配 attribute_not_exists(InitiateMQFlag) 过滤器?