ArangoDB AQL嵌套子查询依赖于来自另一个

mfpqipee  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(271)

我目前有三个集合需要路由到一个端点。我想让课程集合排序它,然后从该课程,我必须使用嵌套的子查询来获取随机审查(可能有多个绑定到同一课程),并获得相关的用户。

User{
    name:
    _id:User/4638
    key: ...}
Review{
    _from: User/4638
    _to: Course/489
    date: ....}
Course{
   _id: Course/489
   title: ...}

我遇到的问题是基于评论获取用户。我尝试过MERGE,但似乎将查询限制为一次使用,而应该有多个。下面是使用LET的当前输出。

"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": []
    },

这是我当前使用的LET子查询方法。我想知道是否有任何方法可以传递或嵌套子查询,以便用户可以读取review。目前我尝试传递LET var,但由于显示了一个空白数组,因此在输出中没有读取。

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}`
bvjveswy

bvjveswy1#

第一个LET查询rev的结果是一个只有一个元素的数组。您可以用两种方法重写完整的查询:
1.将rev设置为LET查询结果的第一个元素:

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)[0]
            LET use = (FOR u IN Users
                FILTER rev._from == u._id
                    RETURN u)
        
            
        RETURN {course: c, review: rev, user: use}

我在自己的项目中使用了这个变体。
1.访问第二个LET查询中rev的第一个元素:

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[0]._from == u._id
                    RETURN u)
        
            
        RETURN {course: c, review: rev, user: use}

这是未经测试的,语法可能需要轻微的改变。你必须看看没有任何评论的情况-我不能说在这种情况下如何表现从我的头上。

相关问题