【问题标题】:Retreiving nested json or a tree from ArangoDB从 ArangoDB 检索嵌套的 json 或树
【发布时间】:2018-04-10 07:42:24
【问题描述】:

ArangoDB 非常适合检索数据图。树是一种图。
我们想将建筑物的数据存储在数据库中。建筑物的结构可以被认为是部分的层次结构。
数据结构非常简单:包含其他程序集的程序集,无限级别的深度。 程序集存储为文档,并通过边缘集合 contains 链接。

我需要的数据,可以用

FOR v, e, path IN 1..3 OUTBOUND
'assemblies/14810426' contains
RETURN path

数据在那里,但是,我想要一个类似的json

{name: "Office Building", 
 assemblies: [{name: "Director's office",
   assemblies: [{name: "Chair"}, {name: "Desk"}]}, 
{name: "Toilet}]}

有没有办法直接从 ArangoDB 获取这种格式,还是我需要自己编写代码才能将图形路径转换为树?
我想编写 Foxx 服务是一种选择,但我想避免这种情况。

有一个similar question, with answer,但这是针对以前版本的 ArangoDB。它需要一些foxx代码。我希望有一个直接来自 AQL 的解决方案。

【问题讨论】:

    标签: database graph hierarchy arangodb


    【解决方案1】:

    您可以使用子查询来聚合结果并将其添加到您的返回结果中。

    这样的AQL查询

    FOR doc IN assemblies 
    FILTER doc._id=='assemblies/14810426'
    LET conn_docs=(
      FOR v,e,path IN 1..3 
        OUTBOUND doc contains RETURN {'name':v.name}
    ) 
    RETURN {'name':doc.name,'assemblies':conn_docs}
    

    将执行任务,将连接的程序集聚合到查询文档中并将其放入返回结果中

    【讨论】:

    • 这给了我一个层次结构。我可以使用它来填充我的树视图,并在用户向下钻取树时执行其他查询。不过,在一个查询中包含多个级别会很好。
    • 你对多层次的概念是什么?
    • 我扩展了示例结果。一个建筑物可以有多个房间,每个房间可以有多个部分,每个部分可能包含更多部分。因此,理论上,包含其他程序集的程序集级别是无限的。
    • 数据库是无模式的...因此您可以灵活地存储数据...您可以通过将子查询与收集器/计数/聚合器语句组合来拥有多个级别
    【解决方案2】:

    我知道你想避免 Foxx,但如果有兴趣,我已经为其他想要对菜单树进行递归嵌套的人回答了这个问题。

    请查看我对Arangodb AQL recursive graph traversal 的回答以了解更多信息。

    【讨论】:

    • 这种方法的问题是,您会为每个程序集触发一个查询。在拥有 50,000 个零件的建筑物中,这将成为一个问题。我想我会尝试在我的客户端代码中将图形查询的输出处理成一棵树。对于我们正在开发的 arangodb_ecto 适配器来说,这可能是一个很好的补充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2017-08-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多