我在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?我只能认为我需要先做一些单独的查询,找到我想删除的玩家的位置,这样就可以作为变量而不是子查询传入,因为我相信它是那个部分正在制作这种非原子。
干杯
答案 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)}); }) }; })