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の 2 番目の項目のプロパティにある項目の 1 つを更新したいと考えています。eventsアクセスする必要があることは事前にmyTable.get($id).events(1)('protocol')('overrides')わかっていますが、ネストされた配列内のどの項目を置き換える必要があるかを事前に知る方法はありません。

この特定の例では、アイテムをindex: 7, and (2 番目のアイテム) に置き換える必要があり、そのプロパティを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 に答える