【问题标题】:Concise way to filter on two child attributes in ArangoDB (AQL / Spring Data ArangoDB)在 ArangoDB (AQL / Spring Data ArangoDB) 中过滤两个子属性的简洁方法
【发布时间】:2018-07-30 16:02:06
【问题描述】:

在 ArangoDB 中,我有一个 trip 集合中的文档,它通过 tripToDriver 集合中的边与 driver 集合中的文档相关,并且行程文档也与 departure 集合中的文档相关,通过departureToTrip 集合中的边。

为了获取他们的司机具有给定 idNumber 并且其关联的出发时间在提供的日期/时间之后具有 startTime 的行程,我已经成功编写了以下 AQL:

FOR doc IN trip
    LET drivers = (FOR v IN 1..1 OUTBOUND doc tripToDriver RETURN v)
    LET departures = (FOR v in 1..1 INBOUND doc departureToTrip RETURN v
    FILTER drivers[0].idNumber == '999999-9999' AND departures[0].startTime >= '2018-07-30'
RETURN doc

但我想知道是否有更简洁/优雅的方式来实现相同的结果?

一个相关的问题,因为我使用的是 Spring Data ArangoDB:是否可以通过派生查询来实现这个结果?

对于单个关系,我可以创建如下查询: Iterable<Trip> findTripsByDriversIdNumber( String driverId ); 但没有运气将出发关系纳入此签名(可能是因为它是入站的?)。

【问题讨论】:

    标签: spring-data arangodb aql


    【解决方案1】:

    首先,您的查询仅在每次旅行只有一个连接的司机/出发地时才有效。您正在获取所有链接的驱动程序,但只检查第一个找到的驱动程序。

    如果这是您的模型,那完全没问题,但我建议在子查询中进行idNumber/startTime 检查。然后,因为我们只需要知道至少一个司机/出发地符合我们的过滤条件,我们在子查询中添加一个LIMIT 1,并且只返回一个true。这对于我们的主查询中的FITLER 来说已经足够了。

    FOR doc IN trip
      FILTER (FOR v IN 1..1 OUTBOUND doc tripToDriver FILTER v.idNumber == @idNumber LIMIT 1 RETURN true)[0]
      FILTER (FOR v IN 1..1 INBOUND doc departureToTrip FILTER v.startTime >= @startTime LIMIT 1 RETURN true)[0]
      RETURN doc
    

    我通过派生查询进行了测试以解决您的问题。如果当前 arangodb-spring-data 版本中没有错误,它将起作用。该错误已修复但尚未发布。您已经可以使用 arangodb-spring-data 的快照版本对其进行测试(1.3.1-SNAPSHOT2.3.1-SNAPSHOT 取决于您的 Spring Data 版本,请参阅 supported versions)。

    以下派生查询方法适用于快照版本。

    Iterable<Trip> findByDriversIdNumberAndDeparturesStartTimeGreaterThanEqual(String idNumber, LocalDate startTime);
    

    要使派生查询工作,您需要在您的类中添加以下注释字段Trip

    @Relations(edges = TripToDriver.class, direction = Direction.OUTBOUND, maxDepth = 1)
    private Collection<Driver> drivers;
    
    @Relations(edges = DepartureToTrip.class, direction = Direction.INBOUND, maxDepth = 1)
    private Collection<Departure> departures;
    

    我还创建了一个有效的example project on github

    【讨论】:

    • 非常感谢您提供的信息丰富的答案和示例项目!我选择了派生查询方法,它适用于arangodb-spring-data3.0.0-RC.1。示例项目还向我介绍了 Lombok @Data,所以现在我已经抛出了大量的 getter/setter 等样板代码:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多