【问题标题】:Many to many AQL query多对多 AQL 查询
【发布时间】:2019-04-20 14:32:46
【问题描述】:

我有 2 个集合和 1 个边缘集合。用户、文件和 FILES_USERS。 我试图为特定用户获取所有 FILES 文档,其中字段“what”设置为“video”,但也嵌入另一个文档,也来自集合 FILES,但其中“what”设置为“trailer”并且属于“视频”的结果。

我已经尝试了下面的代码,但它不能正常工作,我得到了很多重复的结果......它一团糟。我肯定做错了。

 FOR f IN files
 FILTER f.what=="video"

 LET trailer = (
    FOR f2 IN files
      FILTER f2.parent_key==f._key
      AND f2.what=="trailer"
      RETURN f2
   )


  FOR x IN files_users
    FILTER x._from=="users/18418062"
    AND x.owner==true
    RETURN DISTINCT {f,trailer}

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    使用图形查询语法可能有更好的方法来做到这一点,但试试这个。根据您的数据模型调整 UNIQUE 函数。

    LET user_files = UNIQUE(FOR u IN FILES_USERS 
                             FILTER u._from == "users/18418062" AND u.owner 
                             RETURN u._to)
    
    FOR uf IN user_files
     FOR f IN files 
     FILTER f._key == uf AND f.what == "video"
    
     LET trailers = UNIQUE(FOR t IN files 
                            FILTER t.parent_key == f._key AND t.what == "trailer" 
                            RETURN t)
    
    RETURN {"video": f, "trailers": trailers}
    

    【讨论】:

    • 这解决了它,除了它是 f._id 而不是 f._key
    【解决方案2】:

    好吧,检查一下如果您有 TMan 建议的重复数据,但也要检查您的查询语法。看来您的 f 子查询和主查询中的 x 之间没有链接。如果用户 users/18418062 的集合 files_users 中有多个记录,这将导致查询可能返回大量重复

    尝试在主查询中添加连接。比如:

      FOR x IN files_users
        FILTER x._from=="users/18418062"
        AND x.owner==true
           AND x._to == f._id
        RETURN DISTINCT {f,trailer}
    

    在相关说明中,如果您在为 trails 执行子查询时遇到性能问题,您可以尝试仅执行 join 和 array expansion 并查看这是否适用于您的情况

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2010-09-12
      • 2013-09-06
      • 2022-01-18
      相关资源
      最近更新 更多