RethinkDB 分支 / do + “deleteAt 的参数 1 可能不是‘undefined’。”

问题描述 投票:0回答:1

我正在尝试编写一些有点复杂的 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() 来获取记录

rethinkdb
1个回答
0
投票

所以事实证明这里的问题在于我认为我可以在索引上使用

[]

在第 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))
                        })
                    )
                }
            )
        )
    }
)
© www.soinside.com 2019 - 2024. All rights reserved.