DynamoDB:查询操作数类型不正确

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),>不能对其应用运算符。事实上,它接缝您正在使用DocumentClientSDK的抽象,并在文档中指定:

文档客户端通过抽象出属性值的概念来简化对 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)

  • 这应该是正确的答案 (2认同)

not*_*est 4

在Query API的KeyConditionExpression中,分区键只能有相等运算符。排序键可以有多个运算符。

该条件必须对单个分区键值执行相等测试。该条件还可以对单个排序键值执行多个比较测试之一。

示例(排序键):-

sortKeyName < :sortkeyval - 如果排序键值小于 :sortkeyval,则为 true。

sortKeyName <= :sortkeyval - 如果排序键值小于或等于 :sortkeyval,则为 true。

如果您想根据某些条件获取多个项目,您可能需要使用Scan(使用 FilterExpression)BatchGetItem API。

笔记:-

Scan API 会扫描整个表,成本高且效率低。