鉴于以下文件结构:
{
"_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发布于 2018-02-25 03:13:38
目前,我只知道如何更新ArangoDB中的顶级属性。虽然我希望将来有一些替代方案提请我注意,但这里有一些供您选择的方案。
用合并更新
在本例中,我们通过重写数组并在条件被击中时使用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请注意,您希望在company集合中对departments属性添加一个索引。您可以在这里获得有关索引的详细信息:
https://docs.arangodb.com/3.3/Manual/Indexing/WhichIndex.html
你必须权衡这两种模式的利弊。
https://stackoverflow.com/questions/48955791
复制相似问题