在ArangoDB中遍历

时间:2016-02-24 00:30:35

标签: arangodb arangodb-php

我正在尝试用PHP学习ArangoDB。我目前设置了以下图表:

用户 - > userEmail - >电子邮件

'用户'和'电子邮件'是顶点集合,'userEmail'是边集合。

我正在使用此模型进行用户身份验证,根据请求,代码会将给定的电子邮件与数据库匹配,获取该节点并返回传入的“userEmail”边缘和“用户”节点,但仅限于属性“primary”在'userEmail'边缘设置为'TRUE'。

当前解决方案

我使用以下作为当前解决方案,但我不认为这是实现我想要的最佳方式。它也没有给我一种方法来检测'userEmail'边缘的'主要'字段

FOR e IN email
    FILTER e.address == @email
    RETURN {
        'email': e,
        'user': NEIGHBORS(email, userEmail, e, 'inbound', [], {includeData:true})
    }

其他解决方案

我也使用过这个解决方案,结果相同

FOR e IN email
    FILTER e.address == @email
    LET u = (NEIGHBORS(email, userEmail, e, 'inbound', [], {includeData:true}))
    RETURN u

另一种解决方案

我提出的另一个解决方案是

FOR e in email
    FILTER e.address == @email
    FOR p IN TRAVERSAL(user, userEmail, e._id, "inbound", {paths: true})
    RETURN p

这将返回顶点和边,但仅在第二组结果中正确返回。我可以硬编码使用第二组返回值,但我不认为这是最好的方法。

当前的解决方案是最好的还是有更好的方法来做我想要的?

1 个答案:

答案 0 :(得分:2)

您应该首先使用ArangoDB 2.8 new style pattern matching traversals。让我们采用query with the geoindex

FOR oneEmail IN email
  FILTER oneEmail.address == @email
  FOR v, e IN 1..1 INBOUND oneEmail userEmail
    FILTER e.primary == true
    RETURN {
      'email': oneEmail.address,
      'user': v
    }

要在问题中使用的old style NEIGHBORS queries中的主要内容中添加过滤器,请使用edgeExamples参数:

FOR e IN email
  FILTER e.address == @email
  RETURN {
    'email': e,
    'user': NEIGHBORS(email, userEmail, e, 'inbound',
                      [{ Primary : true }],
                      {includeData:true})
  }

一般情况下,如果电子邮件总是只能属于一个用户(1:n关系),我会质疑你选择图表是否是首选的方式,and joins without an edge collection是更好的选择。< / p>