【问题标题】:ArangoDB / AQL Update Nested DocumentsArangoDB / AQL 更新嵌套文档
【发布时间】:2018-02-23 20:29:34
【问题描述】:

给定以下文档结构:

{
  "_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) 中发现了一个更长更复杂的解决方法,但我很好奇更简单的查询到底有什么问题。

FOR c IN company
  FOR d in c.deparments
    FILTER d.id == “456”
    UPDATE d WITH { name: “Department 789” } IN company
RETURN d

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

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

    使用 MERGE 更新

    在此示例中,我们通过重写数组并在满足条件时使用MERGE 函数来更新顶级departments 属性。

    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
    

    使用替代数据模型

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

    “公司”集合

    {
      "_key": "abc",
      "_id": "companies/abc",
      "label": "Company ABC"
    }
    

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

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

    让公司 #ABC 与部门:

    LET company = DOCUMENT("companies/abc")
    
    LET departments =
      (FOR department IN departments
        FILTER department.company == company._id
        RETURN department)
    
    RETURN MERGE(company, {departments})
    

    结果:

    {
      "_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:

    LET department = DOCUMENT("departments/456")
    
    UPDATE department WITH {name: "Department 789"} IN departments
    

    请注意,您需要在departments 集合中的company 属性上添加索引。您可以在此处获取有关索引的详细信息:

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

    您必须权衡这两种模型的优缺点。

    【讨论】:

    • 谢谢!您的第一个解决方案与我原来的 AQL 类似,但更简洁。
    • “我希望将来能引起我的注意” - 这个话题有更新吗?我有同样的问题,我想知道最佳做法。
    猜你喜欢
    • 2021-08-02
    • 2020-10-06
    • 2021-11-05
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多