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

时间:2016-08-13 19:24:08

标签: rethinkdb

我有类似的文件

{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作为集合添加到数组中,空值将被覆盖,但其他值保持不变。因此表格中的结果文件将是

{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')
    }
  })

我还考虑过在这种情况下使用merge,但是需要能够为相同的键定义冲突策略,而且此时似乎不能这样做issue #873

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

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')
    }
  })

1 个答案:

答案 0 :(得分:1)

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