REQL - 使用Filter与(regex)匹配,然后从嵌套哈希

时间:2016-05-04 00:39:53

标签: rethinkdb reql

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

  • 驱动不区分大小写的匹配模型&#39; Seagate&#39;

然后:

  • 打印&#39; Serial&#39;的值键

我正在使用RethinkDB的网络界面,到目前为止,我最接近的是:

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

问题在于,虽然这确实可以正确地过滤结果,但它似乎并没有向我显示“串行”和#39;键。

如果有人能给我一个如何实现这个目标的例子,并解释为什么答案有效,我将非常感激。

2 个答案:

答案 0 :(得分: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字段上执行了('Components')。然后对该seagate字段上'Model'正则表达式匹配的数组进行过滤。对于匹配的驱动器,我们从结果中选择“Serial”字段。最后,concatMap将各个[{ Serial : 'serial' }, {...}]对象从数组中取出并将它们放入最终结果序列中。

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

答案 1 :(得分:0)

虽然这可能会变慢,但它会起作用:

drives

基本上,我们尝试抓取concatMap字段,并将它们与pluck展平,因为它们位于数组中。然后我们过滤使用您的条件,最后function showGroup(group) { $("#hideables").children('div.'+group).show(); $("#hideables").children('div').not('.'+group).hide(); }我们想要的字段。