Riak 2i - 更新删除二级索引
Riak 2i - Update deletes secondary indexes
我正在使用官方 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();
这是我的更新 class:
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 索引更新对象的内容。
- 我是不是做错了什么?
- 我应该手动 Read/Modify/Write 吗?
每次更新值时都必须获取索引并将其写回。参见 2i Indexing an Object。
我建议创建一个字段来保存索引并用 @RiakIndex
注释它。 Java 客户端在获取时自动用 2i 值填充带有此注释的字段。然后,将其值复制到 RiakKVUpdateValue.apply()
中以保留它。或者,正如您已经提到的,获取然后用两个单独的命令写回。这将允许您控制要写回的元数据。不要忘记填充 VClocks。
P.S。自动保留 2i 可能不是一个好主意,因为用户想要保留旧的 2i 值并不明显。我相信这就是为什么由用户决定的原因。
我正在使用官方 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();
这是我的更新 class:
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 索引更新对象的内容。
- 我是不是做错了什么?
- 我应该手动 Read/Modify/Write 吗?
每次更新值时都必须获取索引并将其写回。参见 2i Indexing an Object。
我建议创建一个字段来保存索引并用 @RiakIndex
注释它。 Java 客户端在获取时自动用 2i 值填充带有此注释的字段。然后,将其值复制到 RiakKVUpdateValue.apply()
中以保留它。或者,正如您已经提到的,获取然后用两个单独的命令写回。这将允许您控制要写回的元数据。不要忘记填充 VClocks。
P.S。自动保留 2i 可能不是一个好主意,因为用户想要保留旧的 2i 值并不明显。我相信这就是为什么由用户决定的原因。