如何用RethinkDB实现非作者用户查询(LEFT JOIN等价需求)
解决RethinkDB查询非作者用户的问题
没问题,我来帮你搞定这个查询!你的需求是找出所有非作者身份的用户,对应MySQL的左连接筛选逻辑,在RethinkDB里可以通过outerJoin实现完全等价的效果,也有更简洁的替代写法,我都给你列出来:
方法一:等价于MySQL左连接的写法
这和你原本的MySQL语句逻辑完全对应,步骤清晰:
r.db('journa').table('users') // 以用户表为左表,外连接作者表,关联条件是用户ID匹配作者的userId字段 .outerJoin(r.db('journa').table('authors'), (user, author) => { return user('id').eq(author('userId')); }) // 筛选出没有匹配到作者记录的用户(右表数据为null) .filter(joinedResult => joinedResult('right').eq(null)) // 只提取用户表的原始数据(左表部分) .map(joinedResult => joinedResult('left'));
代码解释:
outerJoin对应MySQL的LEFT JOIN,保留左表(users)的所有记录,匹配不到右表(authors)的记录时,右表部分会返回nullfilter语句对应MySQL的where authors.userId is null,只保留没有作者匹配的用户map用来提取我们需要的用户数据,去掉连接后的冗余结构
方法二:更简洁的筛选写法
如果觉得连接写法有点繁琐,也可以先获取所有作者的用户ID列表,再过滤用户表中不在这个列表里的用户:
// 先获取所有作者对应的用户ID数组 const authorUserIds = r.db('journa').table('authors').pluck('userId').coerceTo('array'); // 筛选出ID不在作者列表里的用户 r.db('journa').table('users') .filter(user => authorUserIds.contains(user('id')).not());
这种写法逻辑更直观,适合数据量不大的场景;如果数据量较大,第一种outerJoin的方式性能会更优。
内容的提问来源于stack exchange,提问作者Tres
相关产品推荐
相关产品推荐

