将文档的所有属性设置为嵌套查询的值

时间:2019-04-20 22:12:19

标签: database nosql arangodb aql

在我的ArangoDB中,我正在尝试实现某种继承。 我有一个父文档,它定义了所有子文档。因此,除了继承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值。

但是,有一种方法可以更有效地做到这一点吗?在传统数据库中是否有类似触发功能的东西?

1 个答案:

答案 0 :(得分:0)

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

假设我了解您要执行的操作,则可以:

一次更新父母和孩子,例如:

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

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

Step1

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)的单个表更改为使用边关系的集合和显式继承关系?根据您正在执行的操作,它可能(也可能没有)有用。

相关问题