首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArangoDB / AQL更新嵌套文档

ArangoDB / AQL更新嵌套文档
EN

Stack Overflow用户
提问于 2018-02-23 20:29:34
回答 1查看 2.5K关注 0票数 6

鉴于以下文件结构:

代码语言:javascript
复制
{
  "_key": "abc",
  "_id": "abc",
  "label": "Company ABC",
  "departments": [
    {
      "name": "Department 123",
      "id": "123"
    },
    {
      "name": "Department 456",
      "id": "456"
    }
  ]
}

你能告诉我为什么以下查询不起作用吗?错误信息是“缺少文档键”。我在另一个SO (ArangoDB AQL: Update single object in embedded array)中找到了一个更复杂的解决方案,但我很好奇简单查询到底有什么问题。

代码语言:javascript
复制
FOR c IN company
  FOR d in c.deparments
    FILTER d.id == “456”
    UPDATE d WITH { name: “Department 789” } IN company
RETURN d
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-25 03:13:38

目前,我只知道如何更新ArangoDB中的顶级属性。虽然我希望将来有一些替代方案提请我注意,但这里有一些供您选择的方案。

用合并更新

在本例中,我们通过重写数组并在条件被击中时使用MERGE函数更新顶级departments属性。

代码语言:javascript
复制
LET company = DOCUMENT("companies/abc")

UPDATE company WITH {
  departments:
   (FOR department IN company.departments
     RETURN department.id == "456" ?
       MERGE(department, {name: "Department 789"}) : department)
} IN companies

使用替代数据模型

以上示例假设部门数据嵌入到公司文档中。请考虑以下几点:

“公司”收藏

代码语言:javascript
复制
{
  "_key": "abc",
  "_id": "companies/abc",
  "label": "Company ABC"
}

“部门”集合(单独的文档)

代码语言:javascript
复制
{
  "_key": "456",
  "_id": "departments/456",
  "company": "companies/abc",
  "name": "Department 456"
}

{
  "_key": "123",
  "_id": "departments/123",
  "company": "companies/abc",
  "name": "Department 123"
}

获得公司#ABC与部门:

代码语言:javascript
复制
LET company = DOCUMENT("companies/abc")

LET departments =
  (FOR department IN departments
    FILTER department.company == company._id
    RETURN department)

RETURN MERGE(company, {departments})

结果:

代码语言:javascript
复制
{
  "_id": "companies/abc",
  "_key": "abc",
  "label": "Company ABC",
  "departments": [
    {
      "_key": "456",
      "_id": "departments/456",
      "company": "companies/abc",
      "name": "Department 456"
    },
    {
      "_key": "123",
      "_id": "departments/123",
      "company": "companies/abc",
      "name": "Department 123"
    }
  ]
}

更新部门#456:

代码语言:javascript
复制
LET department = DOCUMENT("departments/456")

UPDATE department WITH {name: "Department 789"} IN departments

请注意,您希望在company集合中对departments属性添加一个索引。您可以在这里获得有关索引的详细信息:

https://docs.arangodb.com/3.3/Manual/Indexing/WhichIndex.html

你必须权衡这两种模式的利弊。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48955791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档