DynamoDbの更新がエラー「更新式がセカンダリインデックスキーをサポートされていないタイプに更新しようとしました」で失敗する

リッチビー

配列にUUIDを追加するための簡単な更新を実行しています。「更新式がセカンダリインデックスキーをサポートされていないタイプに更新しようとしました」というエラーメッセージが表示されて失敗します。しかし、更新しているフィールドは、セカンダリインデックスのキーではありません。

更新コードは次のとおりです。

const params = {
    "TableName": "churches",
    "Key": {
        "churchId": "0194fb2a-9a0f-4b6a-b347-7adffbaed8ff",
        "countryId": "UK"
    },
    "ReturnValues": "ALL_NEW",
    "UpdateExpression": "set #team = list_append(if_not_exists(#team, :empty_list), :user)",
    "ExpressionAttributeNames": {
        "#team": "team"
    },
    "ExpressionAttributeValues": {
        ":empty_list": [],
        ":user": [
            "b23fe6cf-83e9-417c-b987-e8e645a29bcd"
        ]
    }
}
db.update(params,(err,data) => {
  if(err) console.log('ERROR:',err);
  if(data) console.log('DATA:',data);
})

パーティションキーはchurchIdで、countryIdはソートキーです。

そして、これが出力です:

ERROR: { ValidationException: The update expression attempted to update the secondary index key to unsupported type
    at Request.extractError (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/protocol/json.js:51:27)
    at Request.callListeners (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:685:12)
    at Request.callListeners (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
  message:
   'The update expression attempted to update the secondary index key to unsupported type',
  code: 'ValidationException',
  time: 2019-09-20T16:51:08.712Z,
  requestId: 'IF0CSPBPQLHBAHOBK299V9KGMVVV4KQNSO5AEMVJF66Q9ASUAAJG',
  statusCode: 400,
  retryable: false,
  retryDelay: 4.443976966236384 }

これらは、テーブルに構成されているセカンダリインデックスです。セカンダリインデックスのスクリーンショット

これまで、私は自分自身に次の質問をしました:

  • セカンダリインデックスがキーとして使用するフィールドを更新していますか?-いいえ、更新しているフィールドは「チーム」のみです。これはリストです。
  • JSが文字列以外のものとして解釈できるものにフィールド値を設定していますか?-いいえ、それはUUIDです

何が足りないの?

リッチビー

これは、投稿されたコードではなく、基盤となるデータベースの問題です。

私のインデックスの1つは、キーに文字列を期待していましたが、データベース内の既存のエントリの多くで、プレースホルダーフィールドがnullに設定されていました(キーを取得したらすぐにそのキーを追加することはわかっていましたが、DynamoDBはそうしませんでした。空の文字列が好きなので、nullに設定します)。

これによりインデックスキー違反が発生し、そのレコードへの後続のすべての書き込みが解決されるまで失敗するようです。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.OnlineOps.ViolationDetection.html

修正は、そのキーを完全に削除するか、実際の文字列をnullとしてフローティングのままにするのではなく、その中に入れることです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ