我有类似的文件
{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')
}
})
答案 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)
。