0

REQL に参加するのは本当に大変でした。等号一致の観点からすると、最初は直感的に思えましたが、データを正規表現やリストに一致させる必要があると、突然非常に難しくなります。次に、一致したものの範囲内で、結果セットからキーと値のペアを 1 つだけ取り出したいと考えています。

これは単語数が多いため、1 つのレコードの例を次に示します。

{'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 エントリ) を検索しようとしています。

  • 大文字と小文字を区別しない一致モデル「Seagate」を駆動します

その後:

  • 「シリアル」キーの値を出力します

私は RethinkDB の Web インターフェイスを使用していますが、これまでのところ最も近いものは次のとおりです。

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

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

誰かがこれを達成する方法の例を挙げて、その答えがうまくいく理由を説明できれば、本当に感謝しています.

4

2 に答える 2

0

これは遅くなるかもしれませんが、うまくいきます:

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

基本的に、drivesフィールドを取得concatMapして、配列内にあるためフラット化しようとします。次に、条件を使用してフィルタリングし、最後pluckに必要なフィールドをフィルタリングします。

于 2016-05-04T01:41:34.153 に答える
0

This should do it for you @Locane.

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

The key here is .concatMap which bubbles up the individual objects in an array up the final result sequence.

We can see first that we do a .map on every ('Components') field of the table. Then do a filter on that array matching for the seagate regex on the 'Model' field. And for the drives that match, we pluck just the 'Serial' field from the result. Lastly, the concatMap takes the individual [{ Serial : 'serial' }, {...}] objects out of the array and puts them in the final result sequence.

Operating on an embedded array, not to mention an embedded array of objects, is always a little tricky.

于 2016-05-04T01:38:06.830 に答える