DynamoDB - 为什么我不能在我的关键条件表达式中使用“_”作为前缀?
DynamoDB - Why can't I use an "_" as a prefix in my key condition expression?
我正在使用 AWS DynamoDB DocumentClient 查询我的 DynamoDB 表。在我的表中,我有一个名为“_id”的 属性,它为每个条目保存一个唯一的 ID。当我尝试根据此 ID 查询记录时,我最终收到一条错误消息:"Invalid KeyConditionExpression: Syntax error; token: \"_\", near: \"_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" 作为 属性 名称。我得到了同样的错误:
An error occurred (ValidationException) when calling the Query
operation: Invalid KeyConditionExpression: Syntax error; token: "-",
near: "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"}
您可以尝试 Java 案例代码:
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);
适合我。
我正在使用 AWS DynamoDB DocumentClient 查询我的 DynamoDB 表。在我的表中,我有一个名为“_id”的 属性,它为每个条目保存一个唯一的 ID。当我尝试根据此 ID 查询记录时,我最终收到一条错误消息:"Invalid KeyConditionExpression: Syntax error; token: \"_\", near: \"_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" 作为 属性 名称。我得到了同样的错误:
An error occurred (ValidationException) when calling the Query operation: Invalid KeyConditionExpression: Syntax error; token: "-", near: "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"}
您可以尝试 Java 案例代码:
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);
适合我。