将Document的所有Attributes设置为嵌套查询的值

问题描述 投票:0回答:1

在我的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的值,其中ID相同且InhID大于零。

但是在一个声明中有更有效的方法吗?是否有类似传统数据库中的触发器功能?

database nosql arangodb aql
1个回答
0
投票

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

假设我明白你要做什么,你可以:

一次更新父项和子项,例如:

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

首先更新父级,然后更新子级(在其他时候我假设):

步骤1

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中没有这样的东西。我个人认为这很好,因为触发器往往会造成比它们值得更多的麻烦。我会建立一个具有所需逻辑的中间层,让所有外部程序都通过中间层而不是直接命中集合。您可以在位于DB本身的Arango Foxx层中构建它。 Here是Foxx的文档

最后,您是否考虑过从包含数据和隐式继承关系(基于InhID)到集合的单个表以及使用边缘关系的显式继承关系更改db的结构?根据您的工作情况,它可能(或可能不)有用。

© www.soinside.com 2019 - 2024. All rights reserved.