【问题标题】:Riak 2i - Update deletes secondary indexesRiak 2i - 更新删除二级索引
【发布时间】:2016-01-11 00:38:47
【问题描述】:

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

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

【问题讨论】:

    标签: java riak riak-2i


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多