ArangoDB:在遍历查询中按集合类型过滤

问题描述 投票:0回答:3

我正在使用 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
3个回答
5
投票

另一个答案是使用

IS_SAME_COLLECTION
函数,如this SO答案所示:

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+ 中被删除(参见此答案迁移指南),类似

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

1
投票

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

我所做的是将

_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)

0
投票

您还可以使用选项:

WITH users
FOR v IN 0..5 IN OUTBOUND @vertex_id myEdge
  OPTIONS {vertexCollections: ['users']}
   RETURN v._id

看看这里https://docs.arangodb.com/3.12/aql/graphs/traversals/

© www.soinside.com 2019 - 2024. All rights reserved.