You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)的记录时,右表部分会返回null
  • filter语句对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:18:59