0

进入 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 个条目):

  • 驱动不区分大小写的匹配模型“Seagate”

接着:

  • 打印“Serial”键的值

我正在使用 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

这应该为你做@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将数组中的各个对象冒泡到最终结果序列中。

我们可以首先看到我们对表格的.map每个字段都做了 a。然后对该字段上的正则表达式('Components')匹配的数组进行过滤。对于匹配的驱动器,我们只从结果中提取“串行”字段。最后,将单个对象从数组中取出并将它们放入最终结果序列中。seagate'Model'concatMap[{ Serial : 'serial' }, {...}]

在嵌入式数组上操作,更不用说嵌入式对象数组,总是有点棘手。

于 2016-05-04T01:38:06.830 回答
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 回答