更新符合特定条件的数组元素

Updating array elements that matches a specific criteria

假设我有以下数组

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

我想更新我的 table 其中包含

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

以便我将数据数组中的点字段添加到 "doc-1" 中 "entries" 数组中与数据数组中的相应 id 匹配的每个元素的点字段。最终结果如下:

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

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

我假设 table 中的实际文档现在看起来像这样:

{
  "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 映射 entries 中的每个条目,并使用 indexesOf 查找 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'))
            });
        });
      })
    }
  })