RethinkDB如何实现非匹配正则表达式的文档过滤?
搞定RethinkDB的两个小坑:反向正则匹配与嵌套字段访问
一、如何筛选不匹配特定正则的文档?
首先得明确:RethinkDB用的RE2正则库确实不支持负向断言这类反向匹配语法,不过我们完全可以换个思路绕过去,没必要死磕RE2的限制。
最简单的方法就是先判断字段匹配目标正则,然后取反就行,用ReQL的.not()方法:
r.table('your_table').filter(r.row('target_field').match(/your-regex-pattern/).not())
如果你的正则逻辑特别复杂,RE2实在搞不定,再考虑用r.js()调用JS原生正则(提醒下:大数据量下这么做性能会受影响,尽量优先用ReQL原生方法):
r.table('your_table').filter(r.js(function(row) { // 这里用JS原生正则的反向匹配逻辑 return !/your-regex-pattern/.test(row.target_field); }))
二、嵌套字段访问为啥会出undefined?
你用row"key"或者row.key的写法是错的!RethinkDB的ReQL语法里,访问字段必须用括号调用或者.getField()方法:
- 顶层字段:
r.row('field_name')或者r.row.getField('field_name') - 多层嵌套:比如文档是
{ "outer": { "inner": "value" } },要取inner的话,得这么写:
r.row('outer')('inner') // 等价于 r.row.getField('outer').getField('inner')
要是用r.js()处理嵌套字段,就得遵循JS的语法,而且最好加个空值判断避免报错:
r.table('your_table').filter(r.js(function(row) { // 先确保嵌套字段存在,再做正则判断 return row && row.outer && row.outer.inner ? !/pattern/.test(row.outer.inner) : false; }))
内容的提问来源于stack exchange,提问作者flash4syth
相关产品推荐
相关产品推荐

