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)
。
我有类似的文档
{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)
。