如何使用 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>;) 的形式编写查询,以便自动应用更新。