DynamoDB - 为什么我不能在键条件表达式中使用"_"作为前缀?


我正在使用 AWS DynamoDB

DocumentClient 查询我的 DynamoDB 表。 在我的表中,我有一个名为"_id"的属性,它为每个条目保存一个唯一的 ID。 当我尝试基于此 ID 查询记录时,我最终收到一个错误:"无效的键条件表达式:语法错误;标记:"_",靠近:"_id"。 进行此查询的代码如下。

    function findById(id) {
     //Build query
    var params = {};
    params.TableName = "recordDev";
    params.IndexName = "_id";
    params.KeyConditionExpression = '_id = :id';
    params.ExpressionAttributeValues = {
      ':id': id
    };
    return DynamoDB
        .query(params).promise()
        .then(function(records) {
          return records.Items[0];
        })
        .catch(function(error) {
          return Promise.reject(error);
        });
   };

为 DynamoDB 构建查询参数时,在使用"_"方面,我是否缺少一些内容? 我尝试四处寻找类似的错误,但找不到任何与我的情况相似的错误。

你能尝试使用 ExpressionAttributeNames 参数吗?

var params = {};
params.TableName = "recordDev";
params.IndexName = "_id";
params.KeyConditionExpression = '#id = :id';
params.ExpressionAttributeValues = {
  ':id': id
};
params.ExpressionAttributeNames: {
        "#id":"_id"
};

当属性名称中有"-"时,也会发生相同的问题。例如,我有"id-test"作为属性名称。我得到了同样的错误:

调用查询时出错(验证异常( 操作:无效键条件表达式:语法错误;令牌:"-", 近: "TeamId-testid">

@gkatzioura建议的解决方案也适用于这种情况。这是我使用 Python boto3 约定的实现:

params = {}
params['TableName'] = "myTable"
params['ProjectionExpression']="idStatus"
params['KeyConditionExpression'] = 'scanid = :val1 and #idtest = :val2'
params['ExpressionAttributeValues'] = {":val1":{"S": scanid}, ":val2": {"S": id_test}}
params['ExpressionAttributeNames'] = {"#idtestid": "id-test"}

您可以尝试以下代码:

HashMap<String, AttributeValue> itemValues = new HashMap<String, AttributeValue>();
itemValues.put(":id", AttributeValue.builder().s(key).build());
QueryRequest queryRequest = QueryRequest.builder().tableName("recordDev")
            .keyConditionExpression("_id = :id").expressionAttributeValues(itemValues).build();
QueryResponse queryResponse = dynamoDBClient.query(queryRequest);

为我工作。

最新更新