2014-10-29 4 views
5

Как я могу группировать свои данные в ArangoDB с помощью AQL? Например, моя структура:ArangoDB как применять 'Group by' (COLLECT или ...?)

[ 
    {name: "karl", id: "1", timestamp: "11112"}, 
    {name: "migele", id": "2", timestamp: "11114"}, 
    {name: "martina", id": "2", timestamp: "11116"}, 
    {name: "olivia", id": "3", timestamp: "11118"}, 
    {name: "sasha", id": "4", timestamp: "111120"}, 
] 

Я хочу, чтобы получить данные с уникальным идентификатором и фактической временной метки:

{ 
    karl, 
    martina (because martina timestamp > migele timestamp and his ids is equals), 
    olivia, 
    sasha 
} 

ответ

5

В группе, вы можете использовать COLLECT:

FOR doc IN collection 
    COLLECT id = doc.id INTO g 
    RETURN { id: id, docs: LENGTH(g) } 

Это предоставит список с уникальными идентификаторами, и для каждого уникального идентификатора вы получите количество документов с идентификатором.

Чтобы теперь получить документ с в каждой группе с наибольшим значением в timestamp, сначала необходимо отсортировать каждую группу по временной метке:

FOR doc IN collection 
    COLLECT id = doc.id INTO g 
    LET names = (FOR value IN g[*].doc SORT value.timestamp DESC RETURN value.name) 
    RETURN names 

Наконец, чтобы получить только элемент с наибольшим значением временной метки, используйте names[0] (и вы также можете подать заявку LIMIT, потому что вас будет интересовать только первый элемент):

FOR doc IN collection 
    COLLECT id = doc.id INTO g 
    LET names = (FOR value IN g[*].doc SORT value.timestamp LIMIT 1 DESC RETURN value.name) 
    RETURN names[0]