如何编写处理空结果的 RethinkDB 合并查询

How to write a RethinkDB merge query which handles null results

如果找到 returns 文档的合并版本,而 null 否则,我如何为文档编写 RethinkDB 查询?

以下天真的查询(写在 JavaScript 中)导致从 .merge 抛出异常,以防 .get returns null (即找不到用户):

r.table('users')
  .get(username)
  .merge((user) => {
    return {
      'projects': r.table('projects').getAll(username, {index: 'owner',})
        .coerceTo('array'),
    }
  })
  .run(conn)

编写合并查询,同时处理未找到文档的情况,可以通过使用 do and branch 来完成,以便 merge 仅在非空结果上被调用:

r.table('users')
  .get(username)
  .do((user) => {
    // Only perform a merge if user isn't null
    return r.branch(
      user.eq(null),
      null,
      user.merge({
        'projects': r.table('projects').getAll(username, {index: 'owner',})
          .coerceTo('array'),
      })
    )
  })
  .run(conn)

您可以在合并查询后添加 .default(null) 来处理不存在的错误(尽管这也会处理合并查询中的任何其他不存在的错误)。