如何在RethinkDB中使用分支有条件地更新项目

时间:2017-10-17 11:11:18

标签: rethinkdb rethinkdb-javascript

我正在尝试基于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'
      })
    })
  )
})

1 个答案:

答案 0 :(得分:2)

这里的问题是item是一个数据,而不是一个选择。发生这种情况是因为您使用了r.do。变量不保留有关对象最初来自何处的信息。

似乎可行的解决方案是编写新的r.db('db').table('items').get(itemId)表达式。该选项的问题是行为不是原子的 - 两个不同的查询可能会将相同的元素附加到'元素'阵列。相反,您应该以{{1​​}}的形式编写查询,以便以原子方式应用更新。