如何在ArangoDB中为每个文档使用不同复合键执行UPSERT操作?
ArangoDB多复合键UPSERT实现方案
ArangoDB原生UPSERT语法仅支持单个匹配条件对象,无法直接传入多组复合键(你示例2的写法属于语法错误),要实现按多组复合键判断UPSERT,可通过以下方式实现:
方法1:先查询匹配文档再执行操作
先遍历待处理文档,查询集合中是否存在匹配任意一组复合键的记录,再根据结果选择插入或更新:
LET documents = [ { name: 'Doc 1', value: 777, description: 'description 111' }, { name: 'Doc 2', value: 888, description: 'description 2' }, { name: 'Doc 3', value: 999, description: 'description 3' } ] FOR doc IN documents # 查询是否存在匹配任意一组复合键的文档 LET existingDoc = FIRST( FOR d IN MyCollection FILTER (d.name == doc.name && d.description == doc.description) || (d.value == doc.value && d.description == doc.description) || (d.name == doc.name && d.value == doc.value) RETURN d ) # 根据查询结果执行更新或插入 IF existingDoc != null THEN UPDATE existingDoc WITH doc IN MyCollection ELSE INSERT doc IN MyCollection END
性能优化建议
为避免全表扫描,需为三组复合键分别创建复合哈希索引(或skiplist索引,根据查询场景选择):
- 针对
(name, description)创建索引 - 针对
(value, description)创建索引 - 针对
(name, value)创建索引
方法2:基于多条件循环的UPSERT(备选)
如果希望用UPSERT语法实现,可遍历每个复合键条件执行UPSERT,但需注意重复匹配的情况(比如同一文档可能匹配多个条件,需避免重复更新):
LET documents = [ { name: 'Doc 1', value: 777, description: 'description 111' }, { name: 'Doc 2', value: 888, description: 'description 2' }, { name: 'Doc 3', value: 999, description: 'description 3' } ] FOR doc IN documents LET matchConditions = [ { name: doc.name, description: doc.description }, { value: doc.value, description: doc.description }, { name: doc.name, value: doc.value } ] # 遍历每个匹配条件执行UPSERT FOR condition IN matchConditions UPSERT condition INSERT doc UPDATE doc IN MyCollection # 去重:如果同一文档被多次UPSERT,最后统一更新一次(可选) LET finalExisting = FIRST( FOR d IN MyCollection FILTER (d.name == doc.name && d.description == doc.description) || (d.value == doc.value && d.description == doc.description) || (d.name == doc.name && d.value == doc.value) RETURN d ) IF finalExisting != null THEN UPDATE finalExisting WITH doc IN MyCollection END
注:此方法可能会产生多次更新操作,推荐优先使用方法1。
内容的提问来源于stack exchange,提问作者Akter
相关产品推荐
相关产品推荐

