我正在尝试基于branch
条件对数组字段进行简单的upsert。但是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'
})
})
)
})
答案 0 :(得分:2)
这里的问题是item
是一个数据,而不是一个选择。发生这种情况是因为您使用了r.do
。变量不保留有关对象最初来自何处的信息。
似乎可行的解决方案是编写新的r.db('db').table('items').get(itemId)
表达式。该选项的问题是行为不是原子的 - 两个不同的查询可能会将相同的元素附加到'元素'阵列。相反,您应该以{{1}}的形式编写查询,以便以原子方式应用更新。