2017-01-06 10 views
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__" 
} 

Iはevents配列の2番目の項目のprotocol.overrides性の項目のいずれかを更新します。私はmyTable.get($id).events(1)('protocol')('overrides')にアクセスする必要があることを事前に知っていますが、入れ子になっている配列のどの項目を置き換える必要があるかを事前に知る方法はありません。この具体例では

、私はindex: 7とアイテムを交換する必要がある、とparentIndex: 10(第2項)と私は{foo: "baz", bar: "curley"}にそのvaluesプロパティを変更することを言うことができますことを言うことができます。

これを可能にするreQL APIのメソッドはありません。配列インデックスを知っていればchangeAtを使用することができますが、indexOf関数やそれに類似した述語に一致するインデックスを見つけることができません。

答えて

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()を条件

これはベストプラクティスではありませんが、仕事が終わったようです。

関連する問題