我在dynamoDB中有一个名为' Contributors'的表。我有一个主复合键,其中哈希键是' UserId'并且排序键是“NoteId'”。我想查询属于特定哈希键的所有项目。
现在,如果我使用aws-cli,则以下命令有效:
aws dynamodb query \
--table-name Contributors \
--key-condition-expression 'UserId = :UserId' \
--expression-attribute-values '{
":UserId": {"N":"2"}
}'
但是当我在Node.js中编写查询时,以下两个参数对象都不起作用:
var params = {
TableName: "Contributors",
KeyConditionExpression: "#UserId = :UserId",
ExpressionAttributeNames: {
"#UserId": "UserId"
},
ExpressionAttributeValues: {
":UserId": { "N": "2" }
}
};
或者这个:
var params = {
TableName: "Contributors",
KeyConditionExpression: "#UserId = :UserId",
ExpressionAttributeNames: {
"#UserId": "UserId"
},
ExpressionAttributeValues: {
":UserId": "2"
}
};
我收到以下错误:
ValidationException:一个或多个参数值无效: 条件参数类型与架构类型
不匹配
正确的param对象应该是什么?
答案 0 :(得分:9)
以下代码应该有效。只需给出没有双引号的值。 DocumentClient
将自动解释数据类型。
var docClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: "Contributors",
KeyConditionExpression: "#UserId = :UserId",
ExpressionAttributeNames: {
"#UserId": "UserId"
},
ExpressionAttributeValues: {
":UserId": 2
}
};
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
}
});
答案 1 :(得分:4)
我遇到了问题,因为将数据类型与值一起传递了。只需删除数据类型,DocumentClient就会自动解释该数据类型,并且可以正常工作:
发件人:
ExpressionAttributeValues: {
":UserId": { "S": req.query.status }
}
收件人:
ExpressionAttributeValues: {
":UserId": req.query.status
}
答案 2 :(得分:0)
替换:
var docClient = new AWS.DynamoDB.DocumentClient();
使用:
var docClient = new AWS.DynamoDB();
立即为我解决了这个问题。