ArangoDB删除嵌套数组指定元素时如何保留原文档结构
问题原因
原AQL直接提取Lvl1[*].Lvl2字段,丢弃了Lvl1层级每个元素的ID等原有属性,导致嵌套结构变形,无法直接用于文档更新。
修正后的查询语句
FOR doc in [ { _key:1, Lvl1:[ {ID:1, Lvl2:[{ID:10,Text:"A"},{ID:11,Text:"B"},{ID:12,Text:"C"}]}, {ID:2, Lvl2:[{ID:20,Text:"D"},{ID:21,Text:"E"},{ID:22,Text:"F"}]}, ] }] RETURN { _key: doc._key, Lvl1: doc.Lvl1[* RETURN { // 保留Lvl1层级所有原有属性 ID: CURRENT.ID, // 仅过滤Lvl2数组中符合条件的元素 Lvl2: CURRENT.Lvl2[* FILTER CURRENT.ID != 21] }] }
修正后返回结果(完全匹配原文档结构)
[ { "_key": 1, "Lvl1": [ { "ID": 1, "Lvl2": [ { "ID": 10, "Text": "A" }, { "ID": 11, "Text": "B" }, { "ID": 12, "Text": "C" } ] }, { "ID": 2, "Lvl2": [ { "ID": 20, "Text": "D" }, { "ID": 22, "Text": "F" } ] } ] } ]
真实集合更新写法
如果要直接更新集合(示例集合名为my_collection),可以直接用UPDATE语句:
FOR doc IN my_collection UPDATE doc WITH { Lvl1: doc.Lvl1[* RETURN MERGE(CURRENT, { Lvl2: CURRENT.Lvl2[* FILTER CURRENT.ID != 21] })] } IN my_collection
逻辑说明
嵌套数组过滤需要逐层处理,每层遍历时保留该层级所有原有属性,仅对需要修改的子数组做过滤,即可完全保留原文档的嵌套结构。上述更新语句中使用MERGE()函数,不需要逐个列出Lvl1层级的所有字段,自动保留原有属性,仅覆盖修改后的Lvl2数组。
内容的提问来源于stack exchange,提问作者nulldog
相关产品推荐
相关产品推荐

