如何编写处理空结果的 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)
来处理不存在的错误(尽管这也会处理合并查询中的任何其他不存在的错误)。
如果找到 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)
来处理不存在的错误(尽管这也会处理合并查询中的任何其他不存在的错误)。