进入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的网络界面,到目前为止,我最接近的是:
r.db('production').table('logs').filter(
r.row('Components')('Drives').contains(
function(doc){
return doc('Model').match("(?i)seagate").pluck('Serial')})
)
问题在于,虽然这确实可以正确地过滤结果,但它似乎并没有向我显示“串行”和#39;键。
如果有人能给我一个如何实现这个目标的例子,并解释为什么答案有效,我将非常感激。
答案 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();
}
我们想要的字段。