条件参数类型与架构类型

时间:2018-03-31 05:29:06

标签: node.js amazon-web-services amazon-dynamodb

我在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对象应该是什么?

3 个答案:

答案 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();

立即为我解决了这个问题。