2016-05-04 3 views
0

REQLへの入門は本当に難しかったです。直感的には、まっすぐなイコールマッチの観点からは直感的でしたが、データを正規表現やリストにマッチさせる必要があるときは、突然大変なことになります。次に、一致したものの範囲内で、結果セットからただ1つのキー/値のペアを抜き出したいと思っています。REQL - (正規表現)マッチ​​でフィルタを使用し、ネストされたハッシュのリストから引き抜く

ので、ここでは単一のレコードの近い例だが、言葉がたくさんあります:

{'Components': 
    {'Drives': [ 
     {'Model': 'SeAGaTe', 'Serial': '04894', 'Size': '1000g'}, 
     {'Model': 'SeagATE', 'Serial': '11279', 'Size': '1000g'}, 
     {'Model': 'Intel', 'Serial': 'WX1748959TTR', 'Size': '250g'} 
    ]}, 
    {'Motherboard': 
     {'Model': 'X9DRT-HF+', 'Serial': 'VM128848'} 
    } 
}, 
{'Identity Information': 
    {'Manufacturer': 'Supermicro', 'Serial': 'TT1434', 'Date Made': '2016-05-03'} 
}, 
{'Logs': 
    {'Main Log': '<LOG CONTENTS 5,000 LINES>', 'Messages Log': '<LOG CONTENTS 2,000 LINES>'} 
} 

私はすべてのレコード(約8,000エントリ)を検索しようとしています:

  • 駆動します大文字と小文字を区別しないマッチモデル 'シーゲイト'

そして:

  • 私はRethinkDBのWebインタフェースを使用していて、これまでのところ、私が来ている最も近いです印刷「のシリアル」キー

の値:問題があるということ

r.db('production').table('logs').filter(
    r.row('Components')('Drives').contains( 
    function(doc){ 
     return doc('Model').match("(?i)seagate").pluck('Serial')}) 
) 

これは正しく結果をフィルタリングしますが、「シリアル」キーだけを表示しているようには見えません。

誰かが私にこれを達成する方法の例を与えて、答えがなぜ機能するのか説明できるなら、本当に感謝します。

+0

ちょっと@Locane、私たちの一人があなたのためにこれを解決しましたか? – dalanmiller

答えて

0

これは@Locaneのために行います。ここで

r.db('production').table('logs')('Components').map(r.row('Drives').filter(
    (doc) => { 
    return doc('Model').match("(?i)seagate") 
    }).pluck('Serial') 
).concatMap(r.row) 

キーは、アレイアップ最終結果シーケンス内の個々のオブジェクトをアップ気泡.concatMapあります。

まず、表の('Components')フィールドごとに.mapを実行することがわかります。次に、'Model'フィールドのseagate正規表現に一致する配列のフィルタを実行します。一致するドライブについては、結果から「シリアル」フィールドだけを抽出します。最後に、concatMapは個々のオブジェクトを配列から取り出し、それらを最終結果シーケンスに入れます。

オブジェクトの埋め込み配列はもちろんのこと、埋め込み配列での操作は、やや難解です。

0

これは遅いかもしれないが、それは動作します:

r.db('production')('Components')('Drives') 
    .concatMap(r.row) 
    .filter(function(doc) { 
    return doc('Model').match("(?i)seagate") 
    }) 
    .pluck('Serial') 

は基本的に、我々はdrivesフィールドをgrabdしよう、と彼らは、アレイにあるのでconcatMapでそれらを平ら。その後、条件を使用してフィルタを適用し、最後にpluckのフィールドを使用します。

関連する問題