我正在使用 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)
另一个答案是使用
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)
我必须找到一个解决方案,所以这是我的(我知道不是最好的,但对我有用):
我所做的是将
_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)
您还可以使用选项:
WITH users
FOR v IN 0..5 IN OUTBOUND @vertex_id myEdge
OPTIONS {vertexCollections: ['users']}
RETURN v._id