Ограничить количество результатов в группе (AQL) - PullRequest
0 голосов
/ 13 июля 2020

У меня есть следующий рабочий запрос AQL:

FOR d IN task FILTER d.listId == @listId &&  d.appAccountId == @appAccountId &&  (@serviceId IN d.visibleOnTenants.tenants[*].serviceId || !d.visibleOnTenants.tenants)   
COLLECT groupId=d.status.statusId  INTO groupByType


SORT groupId 
RETURN {
        groupId,
        tasks: groupByType[*].d,
        tasksNo: LENGTH(groupByType[*].d)
    }

Теперь я хочу ОГРАНИЧИТЬ результаты, но для каждой группы, скажем, максимум 10 задач на groupId. Имея LIMIT 0.10 после SORT groupId ограничение количества групп, но мне нужно ограничение на количество задач в группе.

Есть идеи?

1 Ответ

1 голос
/ 13 июля 2020

Поскольку все совпадающие документы уже агрегированы, вы можете выполнить простую операцию SLICE () , чтобы взять первые 10 элементов из каждой группы:

RETURN {
    groupId,
    tasks: SLICE(groupByType, 0, 10)[*].d, // first 10
    tasksNo: LENGTH(groupByType[*].d)      // full count
}

Другой синтаксис c option - использовать встроенный лимит :

tasks: groupByType[* LIMIT 10].d,

Самый подробный вариант с использованием стандартного LIMIT - использовать подзапрос:

tasks: (FOR g IN groupByType LIMIT 5 RETURN g.d),

Подзапрос имеет свою собственную область действия, а LIMIT ограничивается этой областью.

...