1

我有一个包含复杂嵌套文档的表。每个文档的结构类似于以下示例:

{
  "description": "Sample Document",
  "events": [
    {
      "liquids": { ... },
      "protocol": {
        "id": "5b190c4d-6590-49a3-b9a7-69f036f45e55"
      },
      "schedule": { ... }
    },
    {
      "liquids": { ... },
      "protocol": {
        "id": "a4353a88-6021-418f-a18c-0526550edb57",
        "overrides": [
          {
            index: 9,
            values:  {
              foo: "bar"
            }
          {
            index: 7,
            parentIndex: 10,
            values: {
              foo: 8,
              bar: 9
            }
          }
        ]
      },
      schedule: { ... }
    }
  ],
  "id": "7c424fc3-1a58-4a4e-b1b6-8d25412a85da",
  "name": "Sample Doc",
  "project_id": "__ROOT__"
}

我想更新数组protocol.overrides中第二项的属性中的一项。events我提前知道我需要访问myTable.get($id).events(1)('protocol')('overrides'),但我无法提前知道我需要替换嵌套数组中的哪个项目。

在这个特定示例中,假设我需要将项目替换为index: 7, 和parentIndex: 10(第二个项目),并且假设我想将其values属性更改为{foo: "baz", bar: "curley"}.

我在 reQL API 中看不到任何让我这样做的方法。changeAt如果我知道数组索引,则可以使用它,但我没有看到一个indexOf函数或任何类似的东西可以让我通过匹配谓词来找到索引。

4

1 回答 1

1

假设我了解您的确切要求,包括已知的数据以及应该查询的数据(如果没有,请调整它),这就是我的做法:

myTable.get($id) 
  .update(function(row) {
    return {
      events: row('events').map(function(event) {
        return r.branch(
          event('protocol')('overrides').default([]).filter({index: 7}),
          event.merge({
            protocol: {
              overrides: event('protocol')('overrides').default([])
              .map(function(override) {
                return r.branch(
                  override('index').eq(7),
                  override.merge({
                    values: {
                      foo: "baz",
                      bar: "curley"
                    }
                  }),
                  override
                )
              })
            }
          }),
          event
        )
      })
    }
  })

我在用着:

  • .update()直接在行上而不是嵌套数据上的方法
  • r.branch()对于条件

不确定这是最佳做法,但似乎可以完成工作。

于 2017-01-08T17:46:08.220 回答