2016-03-01 7 views
8

私はDynamoDBでドキュメントを 'アップサート'したいと考えています。つまり、キーとフィールドと値のペアのセットを指定したいと思います。そのキーを持つドキュメントが存在しない場合は、そのキーと指定したキーと値のペアで作成されたドキュメントはありません。そのキーを持つドキュメントが存在する場合は、指定したフィールドを指定した値に設定します(これらのフィールドが前に存在しなかった場合は追加する必要があります)。既存の文書の他の未指定フィールドはそのまま残すべきです。DynamoDBでネストされたフィールドをアップセットすることはできますか?

UpdateItemコールでは、このフィールドと値のペアをすべて最上位のフィールドに設定すると、これを行うことができます。構造体がネストされている場合、構造体が存在する限り、UpdateItemはネストされたフィールドを設定するように動作します。つまり、既存の文書に"foo": {}がある場合、"foo.bar": 42を正常に設定できます。

fooオブジェクトが既に存在しない場合は、"foo.bar": 42を設定することはできません(指定したフィールドのドキュメントがまったくなく、私の 'upsert'が

私はAWSのフォーラムで数年前からa discussionを見つけました。これは、私がやりたいことができないことを暗示しているようですが、最近変更されたと思っています。どうすればいいですか?

+1

をあなたに別のデータポイントを与えるために、私はに見えましたこれは2015年の5月(ish)であり、あなたが言及した同じ問題がまだ存在しました。ネストされたフィールドアップサンプリングの目標を達成できませんでしたので、問題へのアプローチとデータの保存方法を変更する必要がありました。 – mkobit

+0

@mkobitあなたのデータポイントに感謝します。それも私が来た結論です。私のデータは一定数のネストされたレベルを持っていたので、 'foo_bar'のような名前のフィールドを使ってデータをフラットにして保存しました。そしてDAOレイヤにマーシャル/アンマーシャリングコードを追加して翻訳しました。それは痛みですが、それは十分にうまくいくようです(少なくとも今のところ) – pkaeding

+2

1年後に同じ問題が発生しました。迷惑な部分は、Dynamoがエラーをスローしないことです。データツリーのその部分を保存しないだけです。 – Jelling

答えて

0

UpdateItemは、「upsert」操作のように動作します。項目がテーブルに存在する場合は更新されます、そうでなければ新しい項目が追加(挿入)されます。以下のクエリを使用して達成することができます(42 "foo.bar" は):その http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

+2

はい、私はそれを読んでいます。しかし、あなたが私の質問を読んでいれば、私は入れ子にされたオブジェクトをアップサンプリングすることができません。 – pkaeding

+0

私はそれをネストされたオブジェクトと共に使用し、それはうまく機能しました(DynamoDBMapper付き)。 http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html – Neil

0

table.update_item(Key = {'Id' : id}, 
       UpdateExpression = 'SET foo = :value1', 
       ExpressionAttributeValues = {':value1': {'bar' : 42}} 
      ) 

・ホープ、このことができます:)

+0

しかし、 'foo'の初期値に他のキーがあった場合には'あなたが更新しているbar値は、失われませんか?たとえば、初期値が '{foo:{biz:33、bar:0}}'で、 'foo.bar'だけを変更し、' foo'オブジェクトの残りの部分を変更しない場合は、これは機能しますか? – pkaeding

+0

私はこれに似た質問に答えました。 https://stackoverflow.com/questions/35569733/how-to-adding-an-empty-or-data-map-in-dynamodb/46791740#46791740それが動作するかどうか確認し、コメントしてください。 – manojpt

関連する問題