のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

AWS DynamoDBでエラー 'One or more parameter values were invalid: Condition parameter type does not match schema type' がでた。

何をしたのか?

先日同様にAWS SDK(Node.js)のdocumentClientクラスでqueryを投げようとしていた。

エラー内容(タイトルと同じ)
One or more parameter values were invalid: Condition parameter type does not match schema type

その際にこのエラーに遭遇し、解決しようと試みているときに出会ったもの。

soredemo-try.hatenablog.com

問題の引数param
let params = {
    TableName: TABLE_NAME,
    ExpressionAttributeValues:{
        ":hash": {"S":hash_key},
        ":range": {"S":range_key}
    },
    KeyConditionExpression:"test_group = :hash AND test_id = :range"
};

原因は?

DynamoDBを触ったことがある人なら上記問題無いように見えるが、これはDocumentClientクラスを使っているのにExpressionAttributeValuesでエイリアスを定義する際に"S"のように型情報をキーとしたハッシュで定義してしまっている。 DocumentClientクラスは型定義が不要になる便利なクラスなので、今回のように型定義をつけてしまうと逆にエラーになってしまう。 今回は型定義をつけてしまったことで、このエラーが発生したが、逆にこの型定義を忘れていても同様のエラーが発生する(おそらくdocumentClientクラスを使用するケースは少ないのでこっちのほうが多数派)ので同様に確認の指標とすると良いだろう。

修正結果

先日の解と同じだが、以下で解決する。

let params = {
    TableName: TABLE_NAME,
    ExpressionAttributeValues:{
        ":hash": hash_key,
        ":range": range_key
    },
    KeyConditionExpression:"test_group = :hash AND test_id = :range"
};