RethinkDB - 有没有更好的方法在嵌套数组上进行这种非原子更新?

时间:2016-07-08 05:06:14

标签: arrays nested rethinkdb

我在RethinkDB数据库中有两个表 - “联盟”和“玩家”,文档结构如下:

播放器

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<body ng-app="demo">
  <div ng-controller="DemoCtrl">
    <div id="number_1" class="number" ng-class="{active: selected=='1',firstactive: firstnumber=='1'}" ng-click="selected='1'">
      <div class="number-text">1</div>
    </div>
  </div>
</body>

联盟

{
  id: 1,
  name: "Bob",
  email: "bob@bob.com"
}

我想要实现的是当播放器被删除时,有一个明显简单的ReQL查询来移除播放器:

{
  id: 1,
  name: "L1",
  standings: [{
    "player_id": 1,
    "position": 1
  },{
    "player_id": 2,
    "position": 2
  }]
}

但是我还需要从他们正在玩的任何联赛中移除该玩家,然后更新该联盟中所有其他玩家的位置,以便他们再次顺序。

这是我必须删除ID为“2”的播放器的查询:

r.table("players").get(1).delete().run(conn, callback);

这是有效的,它会移除已删除的玩家,然后将剩余玩家的位置洗牌以填补空白并再次成为顺序。

我的问题是,有更好的方法吗?我不必将查询指定为nonAtomic?我只能认为我需要先做一些单独的查询,找到我想删除的玩家的位置,这样就可以作为变量而不是子查询传入,因为我相信它是那个部分正在制作这种非原子。

干杯

1 个答案:

答案 0 :(得分:1)

我认为积分总是与数组中的位置匹配?

如果是这样,你可以这样写:

r.table('leagues').getAll(2, {index: 'player_id'}).update(function(row) {
  return {
    standings: row('standings').filter(function (standing) {
      return standing('player_id').ne(2);
    }.map(r.range(), function(standing, index) {
      return standing.merge({position: index.add(1)});
    })
  };
});

如果没有,你可以这样写:

r.table('leagues').getAll(2, {index: 'player_id'}).update(function(row) {
  return row('standings').filter(function (standing) {
    return standing('player_id').eq(2);
  }).nth(0)('position').do(function(pos) {
    return {
      standings: row('standings').filter(function (standing) {
        return standing('player_id').ne(2);
      }).map(function(standing) {
        return r.branch(
          standing('position').gt(pos),
          standing.merge({position: standing('position').sub(1)}),
          standing);
      })
    };
  });
});

{         排名:排(&#39;排名&#39;)。过滤器(功能(站立){           返回站立(&#39; player_id&#39;)。ne(2)         } .map(r.range(),function(standing,index){           return standing.merge({position:index.add(1)});         })       };     })