簡體   English   中英

如何在Arango DB中使用不同的多鍵(復合鍵)執行UPSERT操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM