我正在尝试读取某个值以上的DynamoDB表中的所有值。我将主分区键设置为名为Project_ID的数字。 我正在运行查询以查看高于某个ID的所有值 - 主要是为了测试功能,但是在运行代码时出现错误。
代码:
var params = {
TableName : document.getElementById("tableName").value,
KeyConditionExpression: "Project_ID > :v1",
"ExpressionAttributeValues": {
":v1": {"N": "0"}
}
};
docClient.query(params, function(err, data) {
if (err) {
document.getElementById('textarea').innerHTML += "Unable to query. Error: " + "\n" + JSON.stringify(err, undefined, 2);
} else {
data.Items.forEach(function(project) {
//JSON.stringify(project);
document.getElementById('textarea').innerHTML += "\n" + project.Project_Name + ": " + project.Project_Ref;
});
}
});
输出
`Unable to query. Error: {
"message": "Invalid KeyConditionExpression: Incorrect operand type for operator or function; operator or function: >, operand type: M",
"code": "ValidationException",
"time": "2017-04-28T10:52:31.381Z",`
答案 0 :(得分:2)
在Query API的KeyConditionExpression中,分区键只能有相等运算符。排序键可以有多个运算符。
条件必须对单个分区键执行相等性测试 值。该条件还可以执行几个比较测试之一 在一个单一的键值上。
示例(排序键): -
sortKeyName< :sortkeyval - 如果排序键值小于,则为true :sortkeyval
sortKeyName< =:sortkeyval - 如果排序键值小于,则为true 或等于:sortkeyval。
如果您想根据某些条件获取多个项目,则可能需要使用扫描(使用FilterExpression)或 BatchGetItem API。
注意: - 强>
扫描API将扫描整个表格,这是昂贵且低效的。
答案 1 :(得分:1)
实际上,您在这里有两个错误:
第一个确实是您要在主分区键上应用一个非=
的运算符。 但是,这不是您收到此错误消息的原因!
在您的错误消息中,M
类型适用于Mapping
(或Dictionary
),不能在其上应用运算符>
。确实,它暗示您正在使用DocumentClient
SDK的抽象,并按照documentation中的说明进行操作:
文档客户端通过抽象化属性值的概念来简化在Amazon DynamoDB中处理项目的操作。
这意味着在使用文档客户端进行呼叫时,您应该具有以下查询参数:
var params = {
TableName : document.getElementById("tableName").value,
KeyConditionExpression: "Project_ID = :v1", //I modified this to fix the first point
ExpressionAttributeValues: {
":v1": 0 //Not a dictionary!
}
};
代替:
var params = {
TableName : document.getElementById("tableName").value,
KeyConditionExpression: "Project_ID = :v1", //I modified this to fix the first point
ExpressionAttributeValues: {
":v1": {"N": "0"} //This is an attribute value !
}
};
答案 2 :(得分:0)
Project_ID
是HASH密钥吗?然后,您将需要始终对该属性执行相等性测试。这就是DyanmoDB的工作方式。总是使用=
测试来查询HASH密钥。然后,您可以使用and <extra condition using a sort key>
,并且该额外条件可能会使用<
,BETWEEN,begins_with
等。
因此,您的KeyConditionExpression
只能以Project_ID
开头 = :v1"
,然后您可能会添加其他条件-如果您的表格是使用排序键设置的
没有排序键?然后,您有一个仅允许基于Project_ID
我怎么知道'Project_ID'是我的HASH密钥?
查看我的表格说明
(async ()=>{
const TableName = document.getElementById("tableName").value
const myAWScredentialInfo = getMyCredentialsForAWS()
const dyn = new DynamoDB(myAWScredentialInfo)
console.log(await dyn.describeTable({TableName}).promise())
})()
// 1. the log output will contain a key called 'KeySchema'
// 2. Inside 'KeySchema' look for the entry with a KeyType:'HASH'
// 3 Make sure the `AttributeName` of that one is 'Project_Id'
@ApiReference:DynamoDB API - Query
@ApiReference:DynamoDB API - Describe Table