2016-08-13 38 views
0

我有类似这样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} 

我想这样做在Data Explorer下面,但我得到的错误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

编辑: 功能我结束后使用@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

return r.branch(old_doc(key).eq(null),的回报应该不存在,这就是为什么你会得到这个错误。您还需要key.eq(a)key.eq('a'),而set_union应该为setUnion。最后,我认为你应该在那里打电话FOO.coerceTo('object')而不是r.object(FOO)