ArangoDB如何应用'分组'(COLLECT或......?)

jon*_*nua 5 timestamp arangodb aql

如何使用AQL将数据分组到ArangoDB中?例如,我的结构是:

[
    {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"},
]
Run Code Online (Sandbox Code Playgroud)

我想接收具有唯一ID和实际时间戳的数据:

{
    karl,
    martina (because martina timestamp > migele timestamp and his ids is equals),
    olivia,
    sasha
}
Run Code Online (Sandbox Code Playgroud)

stj*_*stj 7

要分组,您可以使用COLLECT:

FOR doc IN collection
  COLLECT id = doc.id INTO g
  RETURN { id: id, docs: LENGTH(g) }
Run Code Online (Sandbox Code Playgroud)

这将提供具有唯一ID的列表,对于每个唯一ID,您将收到具有id的文档数.

要立即获取具有最高值的每个组中的文档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
Run Code Online (Sandbox Code Playgroud)

最后,要仅接收具有最高时间戳值的成员,请使用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]
Run Code Online (Sandbox Code Playgroud)