如何基于现有值累加更新RethinkDB表中的数据行?
在RethinkDB中实现同ID记录的Value累加更新(Java版)
嘿,我之前正好解决过这个问题!在RethinkDB里实现同ID下value的累加更新其实很简单,核心就是利用它的更新操作结合数值累加,还能顺便处理首次插入的情况。
下面是具体的Java实现代码,你可以直接拿去用:
import com.rethinkdb.RethinkDB; import com.rethinkdb.gen.ast.Table; import com.rethinkdb.model.MapObject; public class RethinkDbValueAccumulate { private static final RethinkDB r = RethinkDB.r; public static void main(String[] args) { // 先假设你已经搞定了RethinkDB的连接,这里省略连接初始化代码 try (var conn = r.connection().hostname("localhost").port(28015).connect()) { Table targetTable = r.db("你的数据库名").table("你的数据表名"); // 定义要处理的目标ID和要累加的value值 int targetId = 25; int valueToAdd = 100; // 方案1:仅更新已存在的记录,不存在则不操作 targetTable.get(targetId) .update(row -> r.hashMap("value", row.g("value").default_(0).add(valueToAdd))) .run(conn); // 方案2:更实用的「存在则累加,不存在则插入」方案 targetTable.insert( r.hashMap("id", targetId, "value", valueToAdd), r.hashMap("conflict", "update", "update_fields", r.array("value")) ) .run(conn); } } }
两种方案的说明:
- 方案1:通过
table.get(targetId)精准定位目标记录,用row.g("value").default_(0)处理记录不存在的边界情况(默认把value当成0来累加),执行update后,已存在的记录value会被累加,不存在的话就不会产生任何插入操作。 - 方案2:用
insert方法配合conflict: update参数,这是RethinkDB专门用来处理“冲突时更新”的语法。当ID存在时,会自动把新的value值累加到现有值上;如果ID不存在,就直接插入这条新记录,一步到位解决两种场景。
验证效果:
比如原记录是{id:25, value:50},执行代码后查询targetTable.get(25),会得到{id:25, value:150};如果之前没有id=25的记录,方案2会直接插入{id:25, value:100},完全符合你的需求。
内容的提问来源于stack exchange,提问作者Nader Hisham
相关产品推荐
相关产品推荐

