Как отфильтровать объединенные поля? (проблемы с производительностью) - PullRequest
0 голосов
/ 30 мая 2019

Предпосылки

Я создал базу данных с двумя сгенерированными коллекциями: пользователи и заметки.Каждый содержит ~ 1M документов.

Вот структуры:

user : (поле name использует индекс пропускаемого списка):

{
    "name": "Some user name"
}

примечание : (поле authors содержит _key s к документам из коллекции users):

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

Задача

Мне нужно присоединитьсяusers коллекция в поле authors, а затем фильтр по пользователю 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 не должен работать хорошо в этом случае?

Пожалуйста, дайте мне знать, если мне нужнопредоставить более подробную информацию.

1 Ответ

0 голосов
/ 31 мая 2019

Итак, две вещи, которые я пропустил:

  • Я не добавил индекс на authors[*].
  • Я использовал (note.authors != null ? note.authors : []).(Думаю, лучше убедиться, что атрибут authors всегда массив)
...