我正在尝试编写一些有点复杂的 ReQL,它从字段中的数组中删除单个值,或者如果该值是数组中唯一的值,则完全删除该记录。
我以为我已经使用branch/do/offsetAt解决了这个问题,但后来我遇到了这个“deleteAt的参数1可能不是
undefined
”。错误,我不知道修复是什么。
r.branch(
r.db('db').table('table').get('uuid').eq(null),
{"deleted": 0, "errors": 0, "inserted": 0, "replaced": 0, "skipped": 0, "unchanged": 1},
r.db('db').table('table').get('uuid').getField('array_field').eq(['value']),
r.db('db').table('table').get('uuid').delete(),
r.do(
r.db('db').table('table').get('uuid').getField('array_field').offsetsOf('value'),
function(index) {
return r.branch(
index.eq([]),
{"deleted": 0, "errors": 0, "inserted": 0, "replaced": 0, "skipped": 0, "unchanged": 1},
r.db('db').table('table').get('uuid').update({
"array_field": r.row('array_field').deleteAt(index[0])
})
)
}
)
)
另外,作为一个附带问题,是否有一种更有效的方法可以做到这一点,而无需不断地一遍又一遍地调用 .get() 来获取记录
所以事实证明这里的问题在于我认为我可以在索引上使用
[]
。
在第 16 行切换到
.deleteAt(index.nth(0))
解决了问题,或者至少将错误更改为
“不能在嵌套查询中使用 r.row”
所以我重写了代码来解决我的第二个问题,即使用
.get()
不断获取数据
我的新代码现在是
r.do(
r.db('db').table('table').get('uuid'),
function(record) {
return r.branch(
record.eq(null),
{"deleted": 0, "errors": 0, "inserted": 0, "replaced": 0, "skipped": 0, "unchanged": 1, "result": "no record"},
record.getField('array_field').eq(['array_value']),
r.db('db').table('table').get('uuid').delete(),
r.do(
record.getField('array_field').offsetsOf('array_value'),
function(index) {
return r.branch(
index.eq([ ]),
{"deleted": 0, "errors": 0, "inserted": 0, "replaced": 0, "skipped": 0, "unchanged": 1, "result": "no index"},
r.db('db').table('table').get('uuid').update({
"array_field": record.getField('array_field').deleteAt(index.nth(0))
})
)
}
)
)
}
)