如何使用某些函数合并两个rethinkdb文档

时间:2014-06-19 14:30:53

标签: rethinkdb

我想在RQL中将以下JS代码中的合并函数转换为我们:

var d1 = {
  del: {
    1: {n: 1, v: 100, vFx:[100, 110]},
    2: {n: 1, v: 100, vFx:[100, 110]}
}};
var d2 = {
  del: {
    2: {n: 1, v: 100, vFx:[100, 110]},
    3: {n: 1, v: 100, vFx:[100, 110]}
}};

function merge(d1, d2) {
    for(k in d2.del){
        v = d2.del[k];
        d1v = d1.del[k];
        if(!d1v){
            d1.del[k] = v;
        } else{
        d1v.n += v.n;
        d1v.v += v.v;
        for(var i = 0,  _len = v.vFx.length; i < _len; i++)
            d1v.vFx[i] += v.vFx[i];
        }
    }
};

// test
merge(d1, d2);
console.log(d1);

// GOAL
r.do(d1, d2, merge)  // this of course doesn't work

我的主要问题是如何遍历文档的键? r.forEach要求我进行豁免。我的用例是我想在update:

中使用这个merge函数
rqlexpr.update(merge(d1, r.row))

1 个答案:

答案 0 :(得分:0)

您可以使用keys映射文档的键,并使用object构建对象。例如:

d1.merge(
  r.object(
    d2('del').keys().concatMap(function(key) {
      return r.branch(
        d1('del').hasField(key).not(),
        [key, d2('del').getField(key)],
        [key, d1('del').getField(key) + d2('del').getField(key)]
      )
    })
  )
)