我有一个带有主键ID的DynamoDB表。我希望能够按ID过滤结果。在SQL中我会做类似WHERE id NOT 'IN (1, 2, 3)'
在我的DynamoDB查询中,我有以下参数
// existingResponseIds == [1,2]
const params = {
IndexName: 'onDate-index',
TableName: AppConstants.ALEXA_DB_RESPONSE_TABLE_NAME,
KeyConditionExpression: "#onDate = :onDate",
FilterExpression : "NOT #id IN (:idValue)",
ExpressionAttributeNames:{
"#onDate": "onDate",
"#id": "id"
},
ExpressionAttributeValues: {
":onDate": date,
":idValue" : existingResponseIds
}
};
然而,它仍然会返回id
为1和2的项目。这种过滤器是否存在?
答案 0 :(得分:1)
DynamoDb 中的 FilterExpression 实际上与不应用过滤器的容量相同,因此如果您想节省 RCU,那么这可能不是一个好主意。您可以通过将数据导入服务器,然后对从查询中返回的项目数组使用过滤器(无过滤器)来执行应用程序级过滤。注意(我使用 arr.filter(data=>predicate(data)) 在 Javascript(Nodejs) 中对我来说很优雅。
另一方面,假设此查询的结果很大,而您正试图通过传输较少量的数据来节省带宽
FilterExpression: "NOT( #id IN (:id0, :id1, :id2) )",
ExpressionAttributeNames: {
"#id": "id"
},
ExpressionAttributeValues: {
":id0": 'data_1'
":id1": ...
}
上面你必须通过枚举来生成,如果我在你的情况下我会做这样的事情,假设 ids 是数组
let idList = ids.map((id,i)=> `:id${i}`).join(','); // ":id0,:id1..."
FilterExpression: `NOT(#id in (${idList})`
表达式属性值也有类似的东西