ArangoDB AQL嵌套子查询关联查询用户结果为空问题求解
需求说明
需要将三个集合的数据统一路由到同一个接口端点返回,执行逻辑如下:
- 首先获取Course集合数据并完成排序
- 通过嵌套子查询为每门课程随机抽取1条关联评论(单门课程可绑定多条评论)
- 同步获取每条抽中评论对应的关联用户信息
集合结构定义
三个集合的字段结构如下:
User{ name: _id: User/4638 key: ... } Review{ _from: User/4638 _to: Course/489 date: .... } Course{ _id: Course/489 title: ... }
现存问题
- 曾尝试使用
MERGE实现关联,但该方式会将查询结果限制为单条,不符合返回多条课程数据的业务要求 - 改用
LET子查询实现后,返回结果中的user字段始终为空数组,异常返回示例如下:
{ "course": { "_key": "789", "_id": "Courses/789", "_rev": "_ebjuy62---", "courseTitle": "Pandas Essential Training", "mostRecentCost": 15.99, "hours": 20, "averageRating": 5 }, "review": [ { "_key": "543729", "_id": "Reviews/543729", "_from": "Users/PGBJ38", "_to": "Courses/789", "_rev": "_ebOrt9u---", "rating": 2 } ], "user": [] }
当前使用的错误AQL语句:
FOR c IN Courses SORT c.averageRating DESC LIMIT 3 LET rev = (FOR r IN Reviews FILTER c._id == r._to SORT RAND() LIMIT 1 RETURN r) LET use = (FOR u IN Users FILTER rev._from == u._id RETURN u) RETURN {course: c, review: rev, user: use}
问题原因
AQL中所有FOR子查询的返回结果都是数组类型,即使子查询加了LIMIT 1,返回的也是长度为1的数组,而非单个文档对象。直接访问rev._from相当于在数组对象上读取自定义属性,得到的值为null,无法匹配到任何用户数据,因此user字段返回空数组。
修复方案
方案1:修正属性访问路径,最小改动原有逻辑
只需要在访问评论的_from属性时,先取数组第一个元素即可:
FOR c IN Courses SORT c.averageRating DESC LIMIT 3 LET rev = ( FOR r IN Reviews FILTER c._id == r._to SORT RAND() LIMIT 1 RETURN r ) LET use = ( FOR u IN Users // 核心修正:rev是数组,取第一个元素后再读_from属性 FILTER rev[0]._from == u._id RETURN u ) RETURN {course: c, review: rev, user: use}
方案2:优化关联逻辑,提升查询性能
可以使用ArangoDB内置的DOCUMENT()函数直接通过评论的_from字段(存储的就是用户文档ID)取数,不需要遍历整个Users集合做过滤,性能更优:
FOR c IN Courses SORT c.averageRating DESC LIMIT 3 LET rev = ( FOR r IN Reviews FILTER c._id == r._to SORT RAND() LIMIT 1 RETURN r ) // 直接通过文档ID获取关联用户,加空值判断避免无评论时报错 LET use = rev[0] ? [DOCUMENT(rev[0]._from)] : [] RETURN {course: c, review: rev, user: use}
内容的提问来源于stack exchange,提问作者StrugglingDev
相关产品推荐
相关产品推荐

