如何使用 RethinkDB 中的分支有条件地更新项目
How to update item conditionally with branch in RethinkDB
我正在尝试根据 branch
条件对数组字段进行简单的更新插入。但是 branch
不接受 reql 表达式作为参数,我收到错误 Expected type SELECTION but found DATUM
.
这可能是我错过的一些显而易见的事情,但是我在任何地方都找不到任何工作示例。
示例来源:
var userId = 'userId';
var itemId = 'itemId';
r.db('db').table('items').get(itemId).do(function(item) {
return item('elements').default([]).contains(function (element) {
return element('userId').eq(userId);
}).branch(
r.expr("Element already exist"),
//Error: Expected type SELECTION but found DATUM
item.update({
elements: item('elements').default([]).append({
userId: 'userId'
})
})
)
})
这里的问题是 item
是一个数据,而不是一个选择。发生这种情况是因为您使用了 r.do
。该变量不保留有关对象最初来自何处的信息。
一个看起来可行的解决方案是编写一个新的 r.db('db').table('items').get(itemId)
表达式。该选项的问题是行为不是原子的——两个不同的查询可能会将相同的元素附加到 'elements' 数组。相反,您应该以 r.db('db').table('items').get(itemId).update(function(item) { return <something>;)
的形式编写查询,以便自动应用更新。
我正在尝试根据 branch
条件对数组字段进行简单的更新插入。但是 branch
不接受 reql 表达式作为参数,我收到错误 Expected type SELECTION but found DATUM
.
这可能是我错过的一些显而易见的事情,但是我在任何地方都找不到任何工作示例。
示例来源:
var userId = 'userId';
var itemId = 'itemId';
r.db('db').table('items').get(itemId).do(function(item) {
return item('elements').default([]).contains(function (element) {
return element('userId').eq(userId);
}).branch(
r.expr("Element already exist"),
//Error: Expected type SELECTION but found DATUM
item.update({
elements: item('elements').default([]).append({
userId: 'userId'
})
})
)
})
这里的问题是 item
是一个数据,而不是一个选择。发生这种情况是因为您使用了 r.do
。该变量不保留有关对象最初来自何处的信息。
一个看起来可行的解决方案是编写一个新的 r.db('db').table('items').get(itemId)
表达式。该选项的问题是行为不是原子的——两个不同的查询可能会将相同的元素附加到 'elements' 数组。相反,您应该以 r.db('db').table('items').get(itemId).update(function(item) { return <something>;)
的形式编写查询,以便自动应用更新。