Dom*_*Dom 3 javascript amazon-dynamodb
我正在尝试读取 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;
});
}
});
Run Code Online (Sandbox Code Playgroud)
输出
`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",`
Run Code Online (Sandbox Code Playgroud)
Bas*_*ien 10
实际上,您在这里有两个错误:
第一个确实是,您正在尝试应用不在=
主分区键上的运算符。但是,这不是您在此处收到错误消息的原因!
在您的错误消息中,M
类型是 for Mapping
(or Dictionary
),>
不能对其应用运算符。事实上,它接缝您正在使用DocumentClient
SDK的抽象,并在文档中指定:
文档客户端通过抽象出属性值的概念来简化对 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!
}
};
Run Code Online (Sandbox Code Playgroud)
代替:
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 !
}
};
Run Code Online (Sandbox Code Playgroud)
在Query API的KeyConditionExpression中,分区键只能有相等运算符。排序键可以有多个运算符。
该条件必须对单个分区键值执行相等测试。该条件还可以对单个排序键值执行多个比较测试之一。
示例(排序键):-
sortKeyName < :sortkeyval - 如果排序键值小于 :sortkeyval,则为 true。
sortKeyName <= :sortkeyval - 如果排序键值小于或等于 :sortkeyval,则为 true。
如果您想根据某些条件获取多个项目,您可能需要使用Scan(使用 FilterExpression)或BatchGetItem API。
笔记:-
Scan API 会扫描整个表,成本高且效率低。