DynamoDB查询的NOT IN子句

时间:2018-02-21 19:39:06

标签: javascript node.js amazon-dynamodb

我有一个带有主键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的项目。这种过滤器是否存在?

1 个答案:

答案 0 :(得分:1)

  1. DynamoDb 中的 FilterExpression 实际上与不应用过滤器的容量相同,因此如果您想节省 RCU,那么这可能不是一个好主意。您可以通过将数据导入服务器,然后对从查询中返回的项目数组使用过滤器(无过滤器)来执行应用程序级过滤。注意(我使用 arr.filter(data=>predicate(data)) 在 Javascript(Nodejs) 中对我来说很优雅。

  2. 另一方面,假设此查询的结果很大,而您正试图通过传输较少量的数据来节省带宽

    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})`

表达式属性值也有类似的东西