Если каждое отдельное действие представлено как ребро между обеими вашими коллекциями вершин, найдите пользователя, найдите его соседей (вершины списка) и сгруппируйте ребра по типу (атрибут ребра?):
FOR u IN users
FILTER u._key == "john"
FOR v, e IN 1..1 OUTBOUND u activities
// v is a list vertex document
// e is an activity edge document
COLLECT list = v._id, type = e.type, user = u._id
WITH COUNT INTO count
RETURN { list, user, type, count }
Результат с моими тестовыми данными:
list | user | type | count
------------|------------|---------|------
lists/john1 | users/john | comment | 1
lists/john1 | users/john | modify | 3
lists/john1 | users/john | vote | 1
lists/john2 | users/john | delete | 1
lists/john2 | users/john | like | 1
lists/john2 | users/john | modify | 2
lists/john2 | users/john | vote | 2
Если вы хотите сохранить список и пользовательский документ, вы можете сделать:
FOR u IN users
FILTER u._key == "john"
FOR v, e IN 1..1 OUTBOUND u activities
COLLECT list = v._id, type = e.type
AGGREGATE count = LENGTH(1) INTO groups
RETURN {
list: groups[0].v,
user: groups[0].u,
type,
count
}
Для больших объемов данныхСледующие могут использовать меньше памяти, потому что это позволяет избежать отслеживания групп и ищет необходимые документы вместо этого:
FOR u IN users
FILTER u._key == "john"
FOR v, e IN 1..1 OUTBOUND u activities
COLLECT list_id = v._id, user_id = u._id, type = e.type
WITH COUNT INTO count
RETURN {
list: DOCUMENT(list_id),
user: DOCUMENT(user_id),
type,
count
}