Rethinkdb:文档中不同键的冲突策略

Rethinkdb: Conflict strategy for different keys in document

我有类似的文档

{id: 0, a: [0, 1], b: null, c: 4, d: 6, e: 7}
{id: 0, a: [1,2], b: 3, c: 5, d: null, f:8}

我想批量插入文档,以便 a 作为一个集合添加到数组中,空值被覆盖,但其他值保持原样。因此 table 中的结果文档将是

{id:0, a:[0,1,2], b:3, c:4, d:6, e:7, f:8}

我尝试在数据浏览器中执行以下操作,但出现错误 SyntaxError: Unexpected token return

r.table('foo').insert(
 [{id: 0, a: [0, 1], b: null, c: 4, d: 6}, {id: 0, a: [1,2], b: 3, c: 5, d: null}],
  {
    conflict: function(id, old_doc, new_doc){
      return (new_doc.keys().map(function (key) {
        return r.branch(key.eq('a'), 
          [key, old_doc('a').setUnion(new_doc('a'))],
          r.branch(old_doc(key).eq(null),
            [key, new_doc(key)],
            [key, old_doc(key)])
        )
      })).coerceTo('object')
    }
  })

我也考虑过在这种情况下使用合并,但需要能够为相同的键定义冲突策略,目前看来你无法做到这一点 issue #873

编辑: 我在 回答和一些其他更改后最终使用的功能。

r.table('foo').insert(
 [{id: 0, a: [0, 1], b: null, c: 4, d: 6, e: 7}, {id: 0, a: [1,2], b: 3, c: 5, d: null, f:8}],
  {
    conflict: function(id, old_doc, new_doc){
      return (new_doc.keys().setUnion(old_doc.keys()).map(function (key) {
        return r.branch(old_doc.hasFields(key).and(new_doc.hasFields(key).not()),
          [key, old_doc(key)],
          new_doc.hasFields(key).and(old_doc.hasFields(key).not()),
          [key, new_doc(key)],
          r.branch(key.eq('a'), 
            [key, old_doc('a').setUnion(new_doc('a'))],
            r.branch(old_doc(key).eq(null).and(new_doc(key).eq(null).not()),
              [key, new_doc(key)],
              [key, old_doc(key)])
          )
        )
      })).coerceTo('object')
    }
  })

return r.branch(old_doc(key).eq(null), 中的 return 不应该存在,这就是您收到该错误的原因。您还需要 key.eq(a)key.eq('a'),并且 set_union 应为 setUnion。最后,我认为您应该在那里调用 FOO.coerceTo('object') 而不是 r.object(FOO)