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

tbe*_*en1 0 amazon-dynamodb aws-sdk

我正在使用AWS DynamoDB DocumentClient查询我的DynamoDB表。在我的表中,我有一个名为“ _id”的属性,该属性为每个条目保留唯一的ID。当我尝试基于此ID查询记录时,最终收到一条错误消息:“无效的KeyConditionExpression:语法错误;令牌:\“ _ \”,附近:\“ _ 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);
        });
   };
Run Code Online (Sandbox Code Playgroud)

在为DynamoDB构建查询参数时,是否缺少有关使用“ _”的内容?我曾尝试查找类似的错误,但是无法找到与我的情况类似的任何错误。

gka*_*ura 5

您可以尝试使用ExpressionAttributeNames参数吗?

var params = {};
params.TableName = "recordDev";
params.IndexName = "_id";
params.KeyConditionExpression = '#id = :id';
params.ExpressionAttributeValues = {
  ':id': id
};
params.ExpressionAttributeNames: {
        "#id":"_id"
};
Run Code Online (Sandbox Code Playgroud)


Abh*_*aya 5

当属性名称中有“-”时也会出现同样的问题。例如,我将“id-test”作为属性名称。我得到了同样的错误:

调用查询操作时发生错误(ValidationException):Invalid KeyConditionExpression: Syntax error; 令牌:“-”,附近:“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"}
Run Code Online (Sandbox Code Playgroud)