如何过滤连接的字段? (性能问题)

How to filter on joined fields? (performance issues)

先决条件

我创建了包含两个生成集合的数据库:用户和注释。每个包含 ~1M 文档。

结构如下:

用户:(name字段使用skiplist索引):

{
    "name": "Some user name"
}

注意:(authors 字段包含 _keyusers 集合中的文档:

{
    "title": "Some title",
    "authors": [
        "12345", "12346", "12347", ...
    ]
}

问题

我需要在 authors 字段上加入 users 集合,然后按用户 name 进行过滤,但这需要很长时间。在我的本地大约需要 3.5 秒。 Specific name 值只出现一次。

let specificUsers = (
    for user in users
        filter user.name == 'Specific name'
        return user
)

for note in notes
    
    let authors = (
        for user in specificUsers
            filter user._key in (note.authors != null ? note.authors : [])
            return user
    )
   
    filter count(authors) > 0


//    filter 'Specific name' in (authors[*].name) // this way takes even longer

    limit 10

    return merge(note, {
        authors: authors
    })

如果我省略 count 过滤器或对“拥有的”属性进行过滤,当然加载速度会很快。但实际上需要对连接的集合进行过滤。就像在关系数据库中一样。

问题

是我做错了什么,还是 ArangoDB 在这种情况下表现不佳?

如果我需要提供更多详细信息,请告诉我。

所以,我错过了两件事:

  • 我没有在 authors[*] 上添加索引。
  • 我正在使用 (note.authors != null ? note.authors : [])。 (我想,最好确保 authors 属性始终是数组)