0

公式の Riak Java クライアント v2.0.2 を使用しています。以前に書き込まれた値を (2i インデックスで) 更新すると、セカンダリ インデックスが保持されません。

これは私が更新する方法です:

Location location = new Location(this.namespace, key);
UpdateValue updateOp = new UpdateValue.Builder(location)
        .withFetchOption(FetchValue.Option.DELETED_VCLOCK, true)
        .withUpdate(new RiakKVUpdateValue(values))
        .build();

そして、これは私の更新クラスです:

public class RiakKVUpdateValue extends Update<Map<String, String>> {

    private final Map<String, String> value;

    public RiakKVUpdateValue(HashMap<String, ByteIterator> values) {
        this.value = StringByteIterator.getStringMap(values);
    }

    @Override
    public Map<String, String> apply(Map<String, String> original) {
        return this.value;
    }
}

2i インデックスを使用したオブジェクトの更新に関するドキュメントは見つかりませんでした。

  • 私は何か間違っていますか?
  • 手動で読み取り/変更/書き込みを行う必要がありますか?
4

1 に答える 1

3

値を更新するたびに、インデックスを取得して書き戻す必要があります。2i オブジェクトの索引付けを参照してください。

インデックスを保持するフィールドを作成し、それに注釈を付けることをお勧めします@RiakIndex。この注釈が付けられたフィールドには、フェッチ時に Java クライアントによって自動的に 2i 値が入力されます。次に、その値をコピーしRiakKVUpdateValue.apply()て保持します。または、既に述べたように、フェッチしてから 2 つの別々のコマンドで書き戻します。これにより、書き戻したいメタデータを制御できます。VClock を設定することを忘れないでください。

PS 自動的に 2i を保持することは、ユーザーが古い 2i 値を保持することを希望するかどうか明らかではないため、悪い考えになる可能性があります。それがユーザーの判断に委ねられている理由だと思います。

于 2016-01-11T05:51:52.360 に答える