5

一意の ID を持つオブジェクトがたくさんあります。次のように、すべてのオブジェクトに複数のラベルを関連付けることができます。

123: ['a', 'hello']
456: ['dsajdaskldjs']
789: (no labels associated yet)

すべてのオブジェクトを DynamoDB に保存するつもりはなく、これらのラベルのセットだけを保存する予定です。したがって、次のようなラベルを追加することは理にかなっています。

  1. (id = needed_id) のレコードを見つける
  2. があり、 という名前のセットがある場合、label_setこのセットにラベルを追加します
  3. そのような ID を持つレコードがない場合、または既存のレコードに という名前の属性がない場合はlabel_set、レコードと属性を作成し、ラベルで構成されるセットで属性を初期化します

数のセットを使用した場合ADD、コマンドの操作だけを使用できますUPDATE。このコマンドは、私が説明したことを正確に実行します。ただし、これは文字列のセットでは機能しません。

指定された主キーに一致する項目がない場合:
ADD - 指定された主キーと属性値の番号 (または番号のセット) を使用して項目を作成します。文字列型には無効です。

そのため、 set toのPUT操作を使用し、その後に (失敗した場合)操作を行う必要があります。これらは 2 つの操作であり、ちょっと面倒です (操作ごとに支払うため、このコストは本来の 2 倍になります)。Expected{"label_set":{"Exists":false}}ADD

この制限は、私には本当に奇妙に思えます。数値セットで機能するものが文字列セットでは機能しないのはなぜですか? 多分私は何か間違ったことをしています。

(123, 'a'), (123, 'hello')セットを持つオブジェクトごとに 1 つのレコードの代わりに、多くのレコードを使用することは解決策ではありませんget。スキャンせずに、セットからすべての値を一度に取得したいのです。

4

4 に答える 4

8
于 2012-11-10T02:07:20.287 に答える
0

多分あなたはできるでしょう:(擬似コード)

try:
    add_with_update_item(hash_key=42, "label")
except:
    element = new Element(hash_key=42, labels=["label"])
    element.save()

この適切な回復アプローチでは、一般的なケースでは1回の呼び出しが必要であり、それ以外の場合は2回の呼び出しが必要です。

于 2012-08-19T23:09:45.103 に答える
0

Dynamo Db は空のセットをサポートしていないため、セットを使用して目的を達成することはできません。カスタムスキーマで文字列を使用し、それから自分でセットを構築することをお勧めします。

于 2012-10-10T21:27:15.600 に答える
0

2 つの操作を避けるために、アイテムに「ConditionExpression」を追加できます。たとえば、次のフィールド/値をアイテムに追加します。

"ConditionExpression": "attribute_not_exists(RecordID) and attribute_not_exists(label_set)"

ソース ドキュメント。

編集:条件文の使用方法に関する非常に優れたガイドを見つけました

于 2015-10-11T19:07:13.090 に答える