概述
這個新手指南會讓你熟悉 ArangoDB。我們將介紹,
安裝并運行一個本地 ArangoDB 服務(wù)器使用Web界面與之交互將示例數(shù)據(jù)存儲在數(shù)據(jù)庫中查詢數(shù)據(jù)庫以再次檢索數(shù)據(jù)編輯和刪除現(xiàn)有數(shù)據(jù)安裝
去?arangodb.com/download,選擇您的操作系統(tǒng)并下載 ArangoDB。如果有包管理器,你也可以參考說明如何通過包管理器進行安裝。
在 Linux 下如果您安裝了二進制包,服務(wù)器會自動啟動。
在 MacOS X 下,如果你用包管理器?homebrew?安裝 ArangoDB,通過命令啟動服務(wù),/usr/local/sbin/arangod.
在 Windows 下把 ArangoDB 安裝為服務(wù),它會自動啟動。未安裝為服務(wù)的情況下,需要運行位于安裝目錄中的 bin 目錄下的?arangod.exe。你可能必須以管理員身份運行,以獲得對 C:\Program Files 目錄的寫權(quán)限。
關(guān)于安裝 ArangoDB 更深入的信息,以及可用的啟動參數(shù),在集群中安裝等,參閱安裝文檔。
保護安裝
默認安裝包含?_system?數(shù)據(jù)庫和?root?用戶。
基于 Debian 的軟件包和 Winsows Installer 都會在安裝過程中詢問密碼?;?RedHat 的軟件包則會設(shè)置一個隨機密碼。對于其它安裝包,你需要執(zhí)行
shell> arango-secure-installation
這會要求輸入一個 root 密碼并保存起來。
Web 界面
服務(wù)本身(arangod)是基于 HTTP/REST 的,但是你可以使用圖形化的 Web 界面讓操作變得簡單。還有?arangosh,一個異步 shell,用來與服務(wù)器進行交互。如果你是開發(fā)者,你可能更喜歡使用 shell 而不是 GUI。目前它還沒有提供像語法高亮這樣的功能。
在項目中開始使用 ArangoDB 的時候,你會尋找官方或社區(qū)使用與項目相同語言編寫的驅(qū)動。驅(qū)動實現(xiàn)了可以在項目編程語言中輕松使用的編程接口,與服務(wù)器進行完全地交互。因此,除非你想自己寫驅(qū)動或者直接使用原始接口,否則理所當然地,應(yīng)該忽略 HTTP API。
為了熟悉數(shù)據(jù)庫系統(tǒng)你可以將驅(qū)動放置一邊而使用 web 界面 (代碼名?Aardvark) 進行基本交互. web 界面將會在你啟動?arangod?之后變?yōu)榭捎? 你可以在瀏覽器中通過?http://localhost:8529?進行訪問 – 如果不可以,請查看?故障排除.
默認情況下, 驗證已啟用. 默認用戶為?root. 依據(jù)所用的安裝方法,安裝過程會提示輸入 root 密碼或者默認 root 密碼為空 (參看?以上).
接下來你會被詢問使用哪個數(shù)據(jù)庫。所有的服務(wù)器實例帶有一個?_system?數(shù)據(jù)庫. 選擇該數(shù)據(jù)庫并繼續(xù).
然后你會看到如下的服務(wù)器統(tǒng)計面板:
要了解關(guān)于接口的更詳細描述,參看?Web Interface.
數(shù)據(jù)庫,集合與文檔
數(shù)據(jù)庫是集合的集合. 集合存儲記錄, 記錄被稱為文檔. 集合等價于 RDBMS 中的表, 而文檔可以被認為是表中的行. 區(qū)別在于你不需要預(yù)先定義有哪些列 (或者屬性). 任意集合中的所有文檔可以擁有任意的屬性鍵與值. 然而實際上一個集合中的文檔具有相似的結(jié)構(gòu), 但是數(shù)據(jù)庫系統(tǒng)本身并不會關(guān)心,無論你的數(shù)據(jù)是什么樣子,數(shù)據(jù)庫系統(tǒng)都會在其上執(zhí)行穩(wěn)定而快速的操作.
在?數(shù)據(jù)模型概念?章節(jié)中可以閱讀更多內(nèi)容.
現(xiàn)在你可以停留在默認的?_system?數(shù)據(jù)庫中并使用 web 接口來創(chuàng)建集合與文檔. 點擊?COLLECTIONS?菜單項, 然后選擇?Add Collection?菜單. 為其指定一個名字,例如?users, 保持其他的設(shè)置不變 (我們希望它是一個文檔集合) 并保存. 會出現(xiàn)一個標記為?users?的新菜單項, 你可以點擊打開.
目錄還沒有任何文檔. 點擊右側(cè)帶有白色加號的綠色圓環(huán)來創(chuàng)建該集合中的第一個文檔. 對話框會詢問你?_key. 你可以將該區(qū)域留空并點擊?Create?來讓數(shù)據(jù)據(jù)系統(tǒng)賦值一個自動生成 (唯一) 的鍵. 注意?_key?屬性是不可修改的, 這意味著一旦文檔被創(chuàng)建你不可以修改該鍵. 你可以用作文檔鍵的內(nèi)容在命名約定?中有相應(yīng)的描述.
在這種情況下,自動生成的鍵值也許是?“9883”?(_key?總是字符串!), 而文檔?_id?也許是?“users/9883”?. 除了一些系統(tǒng)屬性,在文檔中并沒有其他內(nèi)容. 讓我們通過點擊?(空對象)?左側(cè)的圖標添加一個自定義屬性, 然后 添加. 兩個文本輸入框會變得可用,?FIELD?(屬性鍵) 與?VALUE?(屬性值). 輸入名字作為鍵,輸入你的名字作為值.?添加?另一個屬性,將其命名為年齡,并將其設(shè)置為你的年齡. 點擊保存來保存這些修改. 如果你點擊 ArangoDB 圖標右側(cè)頂點的集合: users?, 文檔瀏覽器將會顯示?users?集合中的文檔,而你可以在列表中看到你剛剛創(chuàng)建的文檔.
查詢數(shù)據(jù)庫
是時候通過AQL(ArangoDB’ query language)ArangoDB查詢語言來取得我們的文檔了。我們可以直接通過我們創(chuàng)建的_id屬性查找文檔(當然我們還可以使用其它選項)。點擊QUERIES菜單欄來顯示query editor(查詢編輯器)輸入以下的內(nèi)容(具體取決于你的document ID):
RETURN DOCUMENT("users/9883")
然后點擊Execute來啟動查詢,結(jié)果如下所示:
[ { "_key": "9883", "_id": "users/9883", "_rev": "9883", "age": 32, "name": "John Smith" }]
結(jié)果出現(xiàn)在編輯器下方。如你所見,程序返回了整個文檔,包含著系統(tǒng)屬性。DOCUMENT()?函數(shù)會根據(jù)你提供的_keys或者_ids返回一系列或者單個文檔。我們管返回的結(jié)果叫做查詢結(jié)果,它是一個數(shù)組,包含了我們的文檔查詢結(jié)果(我們可能會得到不只一個文檔,但是即使只有一個文檔結(jié)果,它仍然會返回最上層的數(shù)組)。
這種類型的查詢稱為數(shù)據(jù)訪問查詢。這種查詢不會創(chuàng)建、更改或刪除數(shù)據(jù)。還有另一種類型的查詢,稱為數(shù)據(jù)修改查詢。讓我們使用修改查詢插入第二個文檔:
INSERT { name: "Katie Foster", age: 27 } INTO users
查詢非常容易看懂:?INSERT?關(guān)鍵詞告訴ArangoDB我們想插入一些東西。后面緊跟著的是我們要插入的東西,在這個案例中是一個擁有兩個屬性的文檔。?花括號{ }??表示文件,或者說是對象。我們所說的文件是指集合中的記錄。當用JSON編碼時,我們叫它對象。對象也可以嵌套。下面舉個例子:
{ "name": { "first": "Katie", "last": "Foster" }}
INTO?必須跟在每一個?INSERT?操作后面,后面再接上我們儲存文檔的集合的名字。注意集合的名字不必加上引號。
如果你運行上面的查詢語句,會返回一個空數(shù)組,因為你沒有用?RETURN?關(guān)鍵詞指定要返回的內(nèi)容。?RETURN?關(guān)鍵詞在修改查詢中是可選項,但在數(shù)據(jù)訪問查詢中是必選項。就算用上?RESULT,返回值也可能是空數(shù)組,比如制定文檔無法找到的情況。盡管結(jié)果為空,以上的查詢?nèi)匀粫?chuàng)建新用戶文件。你可以在文檔瀏覽器中驗證這一點。
這一次我們新建一個用戶,并且讓新的結(jié)果返回。
INSERT { name: "James Hendrix", age: 69 } INTO usersRETURN NEW
NEW?是一個虛擬變量,指的是用INSERT語句新建的文檔。查詢結(jié)果如下:
[ { "_key": "10074", "_id": "users/10074", "_rev": "10074", "age": 69, "name": "James Hendrix" }]
現(xiàn)在我們一個有三個用戶了。如何用一條語句返回全部數(shù)據(jù)呢?下面的方法不起作用:
RETURN DOCUMENT("users/9883")RETURN DOCUMENT("users/9915")RETURN DOCUMENT("users/10074")
這里僅有一條?RETURN?語句,如果你嘗試執(zhí)行,則會拋出系統(tǒng)錯誤.??DOCUMENT()?函數(shù)提供了一個補充簽名來指定多文檔處理,所以我們可以:
RETURN DOCUMENT( ["users/9883", "users/9915", "users/10074"] )
所有3個文檔的帶有?_ids 的數(shù)組會被傳遞給函數(shù). 數(shù)組通過方括號?[ ]?表示,而其元素使用逗號進行分隔.
但是如果我們添加更多用戶會怎樣呢? 我們同時需要修改查詢來獲取新添加的用戶. 關(guān)于我們的查詢,我們希望表達的是: “對于 users 集合中的每一個用戶, 返回用戶文檔”. 我們可以使用?FOR?循環(huán)格式化該查詢:
FOR user IN users RETURN user
它表達的是對?users 中的所有文檔進行迭代并使用user?作為變量名, 從而我們可以用來指代當前用戶文檔. 它可以被稱為?doc,?u?或?ahuacatlguacamole, 這取決于你. 然而建議使用一個簡短并自描述的名字.
循環(huán)體告訴系統(tǒng)返回變量?user?的值, 這是一個用戶文檔. 可以像下面這樣返回所有用戶文檔:
[ { "_key": "9915", "_id": "users/9915", "_rev": "9915", "age": 27, "name": "Katie Foster" }, { "_key": "9883", "_id": "users/9883", "_rev": "9883", "age": 32, "name": "John Smith" }, { "_key": "10074", "_id": "users/10074", "_rev": "10074", "age": 69, "name": "James Hendrix" }]
也許你已經(jīng)注意到返回的文檔順序與插入順序并不相同. ArangoDB 并不保證文檔順序,除非你顯式對其進行排序. 我們可以很容易添加了一個?SORT?操作:
FOR user IN users SORT user._key RETURN user
這依然不會返回預(yù)期的結(jié)果: James (10074) 會在 John (9883) 與 Katie (9915) 之前返回. 原因在于?_key?屬性在 ArangoDB 中是一個字符串,而不是一個數(shù)字. 字符串的單個字符會被進行比較.?1?小于?9?,因而結(jié)果是 “正確”的. 如果我們希望使用數(shù)值作為?_key?屬性的值,我們可以將字符串轉(zhuǎn)換為數(shù)字并用其進行排序. 然而這樣做有一些影響T. 我們最好排序其他內(nèi)容. 年齡怎么樣?以降序排列嗎?
FOR user IN users SORT user.age DESC RETURN user
用戶的數(shù)據(jù)會以如下的順序返回:?James (69), John (32), Katie (27)。與用DESC返回降序結(jié)果不同,?ASC返回升序結(jié)果。?ASC是默認的選項,可以省略。
我們可能需要根據(jù)用戶的年齡返回一個子集。讓我們返回30歲以上的用戶的數(shù)據(jù):
FOR user IN users FILTER user.age > 30 SORT user.age RETURN user
這么做會按順序返回John and James。 Katie’s age的屬性不滿足三十歲以上的條件,她只有27歲,因此不再結(jié)果之中。我們可以修改她的年齡,使她重新包含在返回結(jié)果之中,使用如下的查詢語句:
UPDATE "9915" WITH { age: 40 } IN usersRETURN NEW
UPDATE?允許部分編輯已存在的文檔. 另外有?REPLACE, 會移除所有屬性 (除了?_key?與?_id 保持不變) 并且僅添加部分屬性.?另一方面 UPDATE?替換指定的屬性而保持其他屬性不變.
UPDATE?關(guān)鍵字后跟文檔鍵 (或者帶有?_key 屬性的文檔?/ 對象) 來指定要修改的文檔. 要更新的屬性作為對象使用?WITH關(guān)鍵字寫入.?IN?表示在哪個集合中執(zhí)行該操作, 類似?INTO?(這里兩個關(guān)鍵字可以互換). 如果我們使用?NEW?偽變量則會返回應(yīng)用修改的全部文檔:
[ { "_key": "9915", "_id": "users/9915", "_rev": "12864", "age": 40, "name": "Katie Foster" }
相反如果我們使用?REPLACE?, name 屬性會丟失. 使用?UPDATE, 屬性會被保留 (如果我們有其他的屬性,也同樣適用該規(guī)則).
讓我們再次運行?FILTER?查詢, 但是這一次僅返回用戶名:
FOR user IN users FILTER user.age > 30 SORT user.age RETURN user.name
這會返回所有3個用戶的名字:
[ "John Smith", "Katie Foster", "James Hendrix"]
如果僅返回一個屬性的子集,則將其稱為投影. 另一種投影類型是改變結(jié)果的結(jié)構(gòu):
FOR user IN users RETURN { userName: user.name, age: user.age }
該查詢?yōu)樗械挠脩粑臋n定義了輸出格式. 用戶名作為?userName?返回,而不是 name, 在該示例中 age 與屬性性鍵相同:
[ { "userName": "James Hendrix", "age": 69 }, { "userName": "John Smith", "age": 32 }, { "userName": "Katie Foster", "age": 40 }]
也可以計算新值:
FOR user IN users RETURN CONCAT(user.name, "'s age is ", user.age)
CONCAT()?是一個將元素合并為字符串的函數(shù). 在這里我們用其為所有用戶返回一個描述. 正如你看到的,結(jié)果集合并不總是一個對象數(shù)組:
[ "James Hendrix's age is 69", "John Smith's age is 32", "Katie Foster's age is 40"]
現(xiàn)在讓我們來做一些瘋狂的事情: 對于用戶集合中的所有文檔,再次對所有用戶文檔進行迭代并返回用戶組合,例如 John 與 Katie. 對于該問題,我們可以在一個循環(huán)內(nèi)部使用一個循環(huán)來獲得叉積 (所有用戶記錄的所有可能組合, 3?3 = 9). 然而我們并不希望得到類似?John + John* 的組合, 所以讓我們使用一個過濾器條件來去除類似的組合:
FOR user1 IN users FOR user2 IN users FILTER user1 != user2 RETURN [user1.name, user2.name]
我們得到6對組合。類似?James + John?與?John + James?的組合是重復(fù)的,但是已足夠好:
[ [ "James Hendrix", "John Smith" ], [ "James Hendrix", "Katie Foster" ], [ "John Smith", "James Hendrix" ], [ "John Smith", "Katie Foster" ], [ "Katie Foster", "James Hendrix" ], [ "Katie Foster", "John Smith" ]]
我們可以像下面這樣計算兩個年齡之和并計算一些新的內(nèi)容:
FOR user1 IN users FOR user2 IN users FILTER user1 != user2 RETURN { pair: [user1.name, user2.name], sumOfAges: user1.age + user2.age }
我們引入一個新的屬性?sumOfAges?并將兩個年齡相加作為其值:
[ { "pair": [ "James Hendrix", "John Smith" ], "sumOfAges": 101 }, { "pair": [ "James Hendrix", "Katie Foster" ], "sumOfAges": 109 }, { "pair": [ "John Smith", "James Hendrix" ], "sumOfAges": 101 }, { "pair": [ "John Smith", "Katie Foster" ], "sumOfAges": 72 }, { "pair": [ "Katie Foster", "James Hendrix" ], "sumOfAges": 109 }, { "pair": [ "Katie Foster", "John Smith" ], "sumOfAges": 72 }]
如果我們希望過濾新屬性來僅返回總和小于100的組合,我們應(yīng)該定義一個變量來臨時存儲總和,從而我們可以在?FILTER?語句以及?RETURN?語句中使用:
FOR user1 IN users FOR user2 IN users FILTER user1 != user2 LET sumOfAges = user1.age + user2.age FILTER sumOfAges < 100 RETURN { pair: [user1.name, user2.name], sumOfAges: sumOfAges }
LET?關(guān)鍵字后跟指定的變量名 (sumOfAges), 然后是?=?符號與值或表達式來定義變量的值. 在這里我們重用我們的表達式來計算總和. 然后我們使用另一個?FILTER?來略過不需要的組合并使用我們之前聲明的變量. 我們使用用戶名與所計算的年齡值的數(shù)組返回一個投影,為些我們再次使用變量:
[ { "pair": [ "John Smith", "Katie Foster" ], "sumOfAges": 72 }, { "pair": [ "Katie Foster", "John Smith" ], "sumOfAges": 72 }]
小貼士: 當定義對象時, 如果所要求的屬性鍵與屬性值所用的變量相同i, 你可以使用簡寫形式:?{ sumOfAges }?替代?{ sumOfAges: sumOfAges }.
最后,讓我們刪除一個用戶文檔:
REMOVE "9883" IN users
它會刪除用戶 John (_key: “9883”). 我們也可以在循環(huán)中移除文檔 (同樣適用于?INSERT,?UPDATE?與?REPLACE):
FOR user IN users FILTER user.age >= 30 REMOVE user IN users
該查詢會刪除年齡大于等于 30 的所有用戶.
如何繼續(xù)
在AQL?中可探索更多內(nèi)容以及 ArangoDB 提供的更多功能. 繼續(xù)閱讀其他章節(jié)并使用測試數(shù)據(jù)庫試驗以促進你的知識.
如果你希望立即編寫更多的 AQL 查詢,請查看:
數(shù)據(jù)查詢: 數(shù)據(jù)訪問與修改查詢高級操作:?FOR,?FILTER?的詳細描述以及該簡介中未涉及的更多操作函數(shù): 所提供函數(shù)的參數(shù)ArangoDB程序
ArangoDB包有以下程序:
arangod: ?ArangoDB數(shù)據(jù)庫守護進程. 此服務(wù)器程序旨在作為守護程序進程運行,并通過TCP / HTTP向各種客戶端連接到服務(wù)器。arangosh: ?ArangoDB shell. 客戶端實現(xiàn)read-eval-print-Loop(REPL)并提供函數(shù)來訪問和管理ArangoDB服務(wù)器。arangoimp: ArangoDB服務(wù)器的?批量導(dǎo)入器?。它支持JSON和CSV。arangodump:以JSON格式創(chuàng)建ArangoDB數(shù)據(jù)庫備份?的工具。arangorestore: 將備份數(shù)據(jù)加載回ArangoDB數(shù)據(jù)庫的工具。arango-dfdb: ArangoDB的數(shù)據(jù)文件調(diào)試器。它主要用于開發(fā)ArangoDB。arangobench: A基準測試工具。?它可以用于性能和服務(wù)器功能測試。- 蜜度索驥:以跨模態(tài)檢索技術(shù)助力“企宣”向上生長
- 密態(tài)計算技術(shù)助力農(nóng)村普惠金融 螞蟻密算、網(wǎng)商銀行項目入選大數(shù)據(jù)“星河”案例
- 專利糾紛升級!Netflix就虛擬機專利侵權(quán)起訴博通及VMware
- 兩大難題發(fā)布!華為啟動2024奧林帕斯獎全球征集
- 2025年工業(yè)軟件市場格局:7個關(guān)鍵統(tǒng)計數(shù)據(jù)與分析
- Commvault持續(xù)業(yè)務(wù)策略:應(yīng)對現(xiàn)代數(shù)據(jù)保護挑戰(zhàn)的新范式
- 2025年網(wǎng)絡(luò)安全主要趨勢
- 2025年值得關(guān)注的數(shù)據(jù)中心可持續(xù)發(fā)展趨勢
- 量子計算火熱,投資者又在大舉尋找“量子概念股”
- 從量子威脅到人工智能防御:2025年網(wǎng)絡(luò)安全將如何發(fā)展
- 后人工智能時代:2025年,在紛擾中重塑數(shù)據(jù)、洞察和行動
免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關(guān)資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。