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

时间:2017-04-28 11:01:31

标签: 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;
        });

    }
});

输出

    `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",`

3 个答案:

答案 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