更新与特定条件匹配的数组元素

时间:2015-03-19 15:24:01

标签: rethinkdb

我们说我有以下数组

var data = [{ id: 0, points: 1 }, { id: 1, points: 2 }]

我想更新包含

的表格

{ "doc-1": { "id": "abcxyz123", "entries": [ { "id": 0, "points": 5 }, { "id": 1, "points": 3 }, { "id": 2, "points": 0 } ] } }

这样我就可以将数据数组中的points-field添加到"条目"中每个元素的points-field。数组在" doc-1"与数据数组中的相应id匹配。最终结果如下:

{ "doc-1": { "id": "abcxyz123", "entries": [ { "id": 0, "points": 6 }, { "id": 1, "points": 4 }, { "id": 2, "points": 0 } ] } }

如何在ReQL中编写这样的查询?

1 个答案:

答案 0 :(得分:3)

我认为表中的实际文档现在看起来像这样:

{
  "id": "abcxyz123",
  "entries": [{
    "id": 0,
    "points": 5
  }, {
    "id": 1,
    "points": 3
  }, {
    "id": 2,
    "points": 0
  }]
}

没有doc-1嵌套。

然后您的更新可以这样完成:

r.table('t1').update(
  {
    entries: r.row('entries').map(function(e) {
      return r.do(r.expr(data)('id').indexesOf(e('id')), function(dataIndexes) {
        return r.branch(
          dataIndexes.isEmpty(),
          e,
          {
            id: e('id'),
            points: e('points').add(r.expr(data)(dataIndexes(0))('points'))
          });
      });
    })
  })

我正在使用map来映射entriesindexesOf中的每个条目,以查找data中的相应条目(如果存在)。

请注意,这不会向entries列表添加新条目,而只会更新现有条目。如果您还需要添加新条目,请告诉我。

如果您的文档实际上首先包含doc-1字段,则此查询应该完成此任务:

r.table('t1').update(
  { 'doc-1':
    {
      entries: r.row('doc-1')('entries').map(function(e) {
        return r.do(r.expr(data)('id').indexesOf(e('id')), function(dataIndexes) {
          return r.branch(
            dataIndexes.isEmpty(),
            e,
            {
              id: e('id'),
              points: e('points').add(r.expr(data)(dataIndexes(0))('points'))
            });
        });
      })
    }
  })