我有一个棒球运动员的集合,其结构类似于以下内容:
{
"name": "john doe",
"education": [
"Community College",
"University"
]
}
如果我想获得教育数组中所有学校的列表,可以执行如下操作:
FOR school IN unique((
FOR player IN players
COLLECT schools = player.education
RETURN schools
)[**])
FILTER school != null
FILTER LOWER(school) LIKE CONCAT('%', @name, '%')
LIMIT 10
RETURN school
但是为了做到这一点,它必须接触集合中的每一个文档。我在players.education[*]上建立了一个索引,其中包含了所有的学校。有没有什么方法可以直接查询索引中的键(学校名称),而不是每次需要运行查询时都必须接触集合中的每一个记录?
1条答案
按热度按时间ebdffaop1#
有两件事需要考虑:
FILTER school != null
语句需要非稀疏散列索引(稀疏索引会遗漏null
值)1.使用
LOWER(school)
和LIKE
将***总是***触及每个文档-没有索引会有帮助(它必须访问文档以获取值,使其变为小写,等等)请记住,大多数索引都以两种方式之一工作(“全文”是异常值):
1.完全匹配(“哈希”)
1.数值
gt
/lt
评估(“跳过列表”)为了实现您的目标,您需要在字符串属性上创建一个索引,以便您可以精确匹配(区分大小写)。如果您不能可靠地匹配属性值和搜索字符串之间的大小写,那么我建议您要么转换文档中的值,要么创建该属性的小写副本并对其进行索引。
下面是关于索引类型的ArangoDB docs。manual有一个关于索引基础知识和用法的部分,但我更喜欢HTTP文档。