[英]How to Perform UPSERT Operation in Arango DB with Different multiple keys (Composite Key)?
在官方文檔中,它已經展示了如何做到這一點。 下面是一個工作正常的例子:
示例:1
LET documents = [
{ name: 'Doc 1', value: 111, description: 'description 111' },
{ name: 'Doc 2', value: 222, description: 'description 2' },
{ name: 'Doc 3', value: 333, description: 'description 3' }
]
FOR doc IN documents
UPSERT { name: doc.name, description: doc.description }
INSERT doc
UPDATE doc
IN MyCollection
但是,我想為 UPSERT 上的每個文檔檢查不同的多個鍵,例如:
示例:2
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
UPSERT {
{ name: doc.name, description: doc.description },
{ value: doc.value, description: doc.description },
{ name: doc.name, value: doc.value }
}
INSERT doc
UPDATE doc
IN MyCollection
或者,任何其他方式(使用過濾器或其他東西)。 我試過了,但沒有任何效果
如果我理解你的問題,你會想要更新一個文檔,如果有一個至少有 2 個字段匹配的現有文檔,否則將它作為新的插入。
UPSERT 將無法做到這一點。 它只能進行一場比賽。 所以子查詢是必要的。 在下面的解決方案中,我運行了一個查詢來查找與至少 2 個字段匹配的第一個文檔的鍵。 如果沒有這樣的文件,那么它將返回null
。
然后 UPSERT 可以通過將_key
匹配來工作。
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 matchKey= FIRST(
FOR rec IN MyCollection
FILTER (rec.name==doc.name) + (rec.value==doc.value) + (rec.description==doc.description) > 1
LIMIT 1
RETURN rec._key
)
UPSERT {_key:matchKey}
INSERT doc
UPDATE doc
IN MyCollection
注意:將布爾值加在一起有一個技巧,因為 true 將轉換為 1,而 false 為零。 你可以像這樣明確地寫出來: (rec.name==doc.name?1:0)
雖然這對您有用,但這不是一個非常有效的解決方案。 實際上在這種情況下沒有有效的文檔,因為需要搜索所有現有文檔以找到匹配的文檔,以添加/更新每個文檔。 我不確定你想用這個解決什么樣的問題,但重新考慮你的設計可能會更好,這樣匹配條件就可以更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.