ArangoDB AQL 深度数组扫描

Posted

技术标签:

【中文标题】ArangoDB AQL 深度数组扫描【英文标题】:ArangoDB AQL deep array scan 【发布时间】:2021-11-26 10:18:08 【问题描述】:

我有一组客户及其访问过的地方,按如下方式组织:


  "customer_id": 151,
  "first_name": "Nakia",
  "last_name": "Boyle",
  "visited_places": [
    
      "country": "Liberia",
      "cities": [
        "Mullerside",
        "East Graham"
      ]
    ,
    
      "country": "Rwanda",
      "cities": [
        "West Kristofer",
        "Effertzbury",
        "Stokeston",
        "South Darionfort",
        "Lewisport"
      ]
    
  ]

我正在尝试查找访问过特定国家/地区特定城市的所有客户。我的工作方式是这样的:

FOR target IN usertable 
FILTER [] != target.visited_places[* FILTER CURRENT.country == @country AND CONTAINS(CURRENT.cities, @city)]
LIMIT @limit 
RETURN target

查询看起来很麻烦,我不确定它是否有效。

在可读性和性能方面有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您可以按国家/地区过滤并在visited_places[*].country 上为其创建一个持久数组索引,但您仍然需要一个辅助条件来确保您查找的国家和城市出现在同一个数组元素中:

FOR doc IN usertable
  FILTER @country IN doc.visited_places[*].country
  FILTER LENGTH(doc.visited_places[* FILTER CURRENT.country == @country AND @city IN CURRENT.cities])
  RETURN doc

【讨论】:

谢谢! visited_places[].country[].city 上的索引是否也有助于辅助条件? 没有。它需要是单个索引,但常规索引不支持索引嵌套数组。此外,内联表达式不会得到优化,而是总是在运行中执行。您可以使用 ArangoSearch 进行索引,它应该能够更快地找到匹配项,但您仍然需要一个 post-FILTER 以确保国家和城市同时出现在同一个子对象中。

以上是关于ArangoDB AQL 深度数组扫描的主要内容,如果未能解决你的问题,请参考以下文章

Arango db 快速入门

Arango db 快速入门

如何在 ArangoDB AQL 查询中获取第一个和最后一个条目

最后使用 AQL 在 ArangoDB 中插入 _key?

Arangodb AQL 连接、合并、嵌入嵌套的三个或更多集合

ArangoDB图数据库--总参