2016-12-12 59 views
2

我想插入值到阿朗戈-DB通過自定義鍵,但我並沒有在SQL發現了一個「如果不存在」之類的函數「如果不存在」上Arangodb

let exist = (
    FOR u IN User 
    FILTER u._key == "newkey" 
    return u 
) 
Filter LENGTH(exist)==null 
    INSERT{ 
     _key:    "newkey", 
     value1:    "value" 
    } IN User 
return NEW 

像這樣的東西也不起作用

INSERT{ 
    _key:    "newkey", 
    value1:    "value" 
} 
IN User ON DUPLICATE KEY IGNORE 
return NEW 

回答

2

如何看UPSERT命令,並且只給它的命令,並沒有爲UPDATEINSERT一部分的指令。那樣只有它不存在纔會執行。

https://docs.arangodb.com/3.0.10/AQL/Operations/Upsert.html

這裏是它正在使用的一個示例:

UPSERT { 
    username: @username 
} 
INSERT { 
    username: @username, 
    fullname: @fullname, 
    verified: false 
} 
UPDATE { 
} 
IN Users 

RETURN { 
    user: NEW 
} 

UPSERT命令有三個部分到它。

第一個是比較器,它是如何識別文檔是否存在。在這種情況下,比較器是{ username: @username }。它使用它來搜索Users集合以查看是否匹配。

如果不匹配,則執行INSERT命令。
如果匹配,則執行UPDATE命令。

在這種情況下,我們一直很棘手,並沒有提供任何關於UPDATE命令的內容,所以它不會更新任何內容,只會在不存在的情況下插入。

INSERT塊將顯示未找到記錄時插入的鍵/值。

在這種情況下,它也會被設置驗證爲false,因爲任何剛剛創建的新用戶都未驗證。這將是應用程序中另一個命令的責任,將此標誌轉換爲true

另請注意RETURN條目,它引用NEW,如果需要,還可以引用一個名爲OLD的東西。

這些是由UPSERT命令提供的內部返回值,它們引用了被引用的文檔的兩個版本。

NEW總是被填充,它包含文檔的最新版本,無論是否進行了更新。

OLD包含文檔的舊版本,然後用新值更新。如果文檔沒有更新,那麼它會返回null,所以在這種情況下,它會一直爲空,因爲更新不會發生。

是的,這完全按照其他數據庫語言中的IF NOT EXISTS樣式命令執行。如果比較器不匹配,它會插入新記錄,如果比較器匹配,它什麼都不做!

我希望有幫助!

+0

是否有可能,您可以創建示例查詢。它沒有爲我工作,沒有選項。 – ich

+0

謝謝,我的聲譽是低,upvote :)當我可以做到這一點,我會做 – ich

0

它的一點點不滿意,Arangodb社區幫助了我。它不存在像「IF NOT EXITS」這樣的查詢,在這種情況下數據庫系統拋出一個exeption,爲了使查詢可用,您必須添加一個忽略錯誤消息對話框。

INSERT{ 
    _key:    "key", 
    value1:    "value" 
}in Users OPTIONS {ignoreErrors: true} 
return NEW