Эффективно считать документы с различными значениями для данного поля - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь подсчитать количество документов, которые находятся в каждом возможном состоянии в конкретной коллекции Aran go.

Это должно быть возможно за 1 проход по всем документам с использованием сортировки по сегментам например, стратегия, в которой вы перебираете все документы, если значение для состояния ранее не было видно, вы добавляете счетчик со значением 1 в список. Если вы видели это состояние раньше, вы увеличиваете счетчик. Как только вы дойдете до конца, у вас будет счетчик для каждого возможного состояния в БД, который указывает, сколько документов в настоящее время хранится в этом состоянии.

Кажется, я не могу понять, как писать этот тип логи c в AQL для отправки в качестве запроса. Текущая стратегия выглядит следующим образом:

  1. L oop по всем документам, фильтруя только документы определенного состояния.
  2. L oop по всем документам, фильтруя только документы отличается конкретное состояние.
  3. ...
  4. Все состояния были отфильтрованы.
  5. Возвращаемый размер каждого набора

Это работает, но я уверен, что это намного медленнее, чем должно быть. Это также означает, что если мы добавляем новое состояние, мы должны обновить запрос до l oop по всем документам дополнительное время, фильтруя по новому состоянию. Запрос типа корзины будет быстрым и не требует обновления, так как создаются новые состояния.

Если бы это были документы:

  • {A}
  • {B}
  • {B}
  • {C}
  • {A}

Тогда я бы хотел получить результат be {A: 2, B: 2, C: 1} где A, B, & C - значения для определенного поля. Фильтры текущей стратегии, например,

LET docsA = (
    FOR doc in collection
        FILTER doc.state == A
        RETURN doc
)

Затем вручную создайте объект возврата, вызывающий LENGTH, для каждого списка документов

Любая помощь или дополнительная информация будет принята с благодарностью

1 Ответ

1 голос
/ 25 января 2020

Как насчет использования функции COLLECT? (см. документы здесь )

FOR doc IN collection
    COLLECT s = doc.state WITH COUNT INTO c
    RETURN { state: s, count: c }

Это вернет что-то вроде:

[
  { state: 'A', count: 23 },
  { state: 'B', count: 2 },
  { state: 'C', count: 45 }
]

Будет ли это достигать sh того, что вы ищете?

...