【问题标题】:ArangoDB: filter by collection type in a traversal queryArangoDB:在遍历查询中按集合类型过滤
【发布时间】:2016-10-26 07:59:21
【问题描述】:

我正在使用 ArangoDB 2.8

我正在执行包含 2 个不同集合的遍历查询。但是在我的结果中,我只想获得一个特定的集合,但我没有看到按集合名称过滤的方法。

就我而言,我有 address 集合和 user 集合。在address 集合中,我区分了 3 个级别:{addressType: state}、{addressType: city} 和 {addressType: street}。然后我有一个从address 链接到user 集合(状态>城市>街道>用户)的边缘。我想做一个从address(任何类型)到user(如果有的话)的遍历(如下面的代码),并且只返回user类型的集合——例如,如果一条街道没有有一个指向用户的链接然后返回空-。

For p in TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false})
   RETURN p.vertex._id)

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    另一个答案是使用IS_SAME_COLLECTION 函数,正如this SO answer 所暗示的那样:

    FOR p IN TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false})
      FILTER IS_SAME_COLLECTION('user', p.vertex._id)
       RETURN p.vertex._id)
    

    或者,由于 TRAVERSAL 在 ArangoDB 3.0+ 中被删除(see this answermigration guide),类似

    FOR v IN 0..5 IN OUTBOUND @vertex_id myEdge
      FILTER IS_SAME_COLLECTION('user', v._id)
       RETURN v._id)
    

    【讨论】:

      【解决方案2】:

      好吧,我必须找到一个解决方案,所以这是我的(我知道这不是最好的,但对我有用):

      我所做的是将_id 拆分为"/" 并检查第一部分(集合名称)是否在['user']

      For p in TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false})
        FILTER (SPLIT(p.vertex._id, "/", 1)[0]) IN ['user']
         RETURN p.vertex._id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多