【问题标题】:Aerospike - How to insert a unique item in a given list using Java?Aerospike - 如何使用 Java 在给定列表中插入唯一项?
【发布时间】:2020-01-29 10:31:14
【问题描述】:

如果我运行下面的代码,来自 getUserName() 的值会附加到列表中。但是,如果我再次运行它,则会再次插入相同的值。我的问题是,如何确保该值仅附加一次(唯一)?

我当前的代码

Operation operation = ListOperation.append("names", Value.get(usr.getUserName()));
Record record = client.operate( policy, key, operation );

示例:将“name”bin 视为字符串列表。

'LIST["T1", "T2"]'

如果我再次添加 T2,列表应该保持不变。

【问题讨论】:

标签: java aerospike


【解决方案1】:

ListOperation.append() 可以采用 ListPolicy,它采用标志。对于这样的写入操作,ListWriteFlags 具有字段ADD_UNIQUENO_FAIL,如果您希望仅在新的唯一列表元素时才添加值,则应将它们组合起来。

https://www.slideshare.net/RonenBotzer/asug-tlvmeetup2talk

【讨论】:

  • 完美。谢谢!
【解决方案2】:

我假设 ListOperation 由 List 支持,因为代码不可用。假设是这样,列表在允许空值的同时保持顺序。另一方面,集合只允许唯一的非空值,因此这对您来说是一个完美的解决方案。

Set<String> values = new HashSet<>();

values.add("T1");
values.add("T1"); // already contains value

替代方案 如果您需要维护 Collection 的顺序但您想要唯一值,另一种选择是检查添加是否该值已存在或使用 Stream#distinct。

List<String> values = ListOperation.values.stream().distinct().collect(Collectors.toList());

【讨论】:

  • 很抱歉,该 bin 的值会不断更新......所以 HashSet 不适用于我的情况。
  • 喂,动态更新是什么意思?
  • 例如,目前 Aerospike 数据库中存储了 2 个项目.... 新元素不断添加。因此,如果我尝试添加的元素已经存在于数据库中,则不应创建重复项
  • 不确定我是否遵循,在 UDF 期间应用的更新是原子的。当 UDF 锁定记录时,列表无法接收外部更新。
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2012-10-26
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多