我正在使用官方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索引更新对象的信息。


我做错什么了吗?
我应该手动读取/修改/写入吗?

最佳答案

您必须获取索引并在每次更新值时将其写回。请参见2i Indexing an Object

我建议创建一个字段来保存索引并用@RiakIndex对其进行注释。在获取带有此注释的字段时,Java客户端会自动为其填充2i值。然后,将其值复制到RiakKVUpdateValue.apply()中以保留它。或者,如您已经提到的,获取然后写回两个单独的命令。这将允许您控制要回写的元数据。不要忘记填充VClock。

附言自动保留2i可能不是一个好主意,因为用户是否希望保留旧的2i值并不明显。我相信这就是由用户决定的原因。

10-07 23:33