【问题标题】:Set all Attributes of Document to the values of nested query将 Document 的所有属性设置为嵌套查询的值
【发布时间】:2019-04-20 22:12:18
【问题描述】:

在我的 ArangoDB 中,我试图实现某种继承。 我有一个父文档,它定义了它的所有子文档。因此,除了 Inheritance-ID 之外,这些值都是相同的。

因此,在这种情况下,父文档的值如下:

ID: 1
InhID: 0
Name: Doc_1

它的孩子看起来像这样:

ID: 1
InhID: 1
Name: Doc_1 


ID: 1
InhID: 2
Name: Doc_1 

当我将名称从 Doc_1 更改为父级中的任何其他名称时,其所有子级也将更改,新添加的属性也是如此。

当前的方法是手动为每个属性编写 AQL-Update 查询,将所有值一一更新,并将其设置为 ID 相同且 InhID 大于零的 parent 的值。

但是有没有更有效的方法可以在一个语句中做到这一点?是否有类似传统数据库中的触发功能?

【问题讨论】:

    标签: database nosql arangodb aql


    【解决方案1】:

    假设我们在 test1 集合中有数据,其中包含以下字段:ParentID、InhID、Name、Potatoe

    假设我理解你想要做什么,你可以:

    使用以下内容同时更新父级和子级:

    for t in test1
    Filter t.ParentID == 1 
    update t WITH { Potatoe: "baked" , Name: "Doc_2"} IN test1 
    

    先更新父节点,然后更新子节点(我假设在其他时间):

    第一步

    for t in test1
    Filter t.ParentID == 1 AND t.InhID == 0
    update t WITH { Potatoe: "baked" , Name: "Doc_2"} IN test1
    

    第 2 步

    let Parent = (for p in test1
        Filter p.ParentID == 1 AND p.InhID == 0
        return p)
    for p1 in Parent 
        for Children in test1
        Filter Children.ParentID == p1.ParentID AND Children.InhID > p1.InhID
        update Children WITH {Potatoe: p1.Potatoe, Name: p1.Name} IN test1
    

    就触发器而言,Arango 中没有这样的东西。我个人认为这很好,因为触发因素往往会造成比其价值更多的麻烦。相反,我会构建一个具有所需逻辑的中间层,并让所有外部程序都通过中间层,而不是直接访问集合。您可以在位于数据库本身的 Arango Foxx 层中构建它。 Here 是 Foxx 的文档

    最后,您是否考虑过将 db 的结构从包含数据和隐式继承关系(基于 InhID)的单个表更改为使用边缘关系的集合和显式继承关系?取决于你在做什么,它可能有用(也可能没用)。

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 2010-11-05
      • 2021-12-05
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      相关资源
      最近更新 更多