如何在 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>;) 的形式编写查询,以便以原子方式应用更新。

最新更新