自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開源NoSQL數(shù)據(jù)庫:ArangoDB入門指南

數(shù)據(jù)庫 其他數(shù)據(jù)庫
本文這個新手指南會讓你熟悉 ArangoDB。我們將介紹安裝并運行一個本地 ArangoDB 服務(wù)器、使用Web界面與之交互、將示例數(shù)據(jù)存儲在數(shù)據(jù)庫中等等。

[[209070]]

概述

這個新手指南會讓你熟悉 ArangoDB。我們將介紹,

  • 安裝并運行一個本地 ArangoDB 服務(wù)器
  • 使用Web界面與之交互
  • 將示例數(shù)據(jù)存儲在數(shù)據(jù)庫中
  • 查詢數(shù)據(jù)庫以再次檢索數(shù)據(jù)
  • 編輯和刪除現(xiàn)有數(shù)據(jù)

安裝

去 arangodb.com/download,選擇您的操作系統(tǒng)并下載 ArangoDB。如果有包管理器,你也可以參考說明如何通過包管理器進(jìn)行安裝。

在 Linux 下如果您安裝了二進(jìn)制包,服務(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ù),在集群中安裝等,參閱安裝文檔。

保護(hù)安裝

默認(rèn)安裝包含 _system 數(shù)據(jù)庫和 root 用戶。

基于 Debian 的軟件包和 Winsows Installer 都會在安裝過程中詢問密碼?;?RedHat 的軟件包則會設(shè)置一個隨機(jī)密碼。對于其它安裝包,你需要執(zhí)行

shell> arango-secure-installation

這會要求輸入一個 root 密碼并保存起來。

Web 界面

服務(wù)本身(arangod)是基于 HTTP/REST 的,但是你可以使用圖形化的 Web 界面讓操作變得簡單。還有 arangosh,一個異步 shell,用來與服務(wù)器進(jìn)行交互。如果你是開發(fā)者,你可能更喜歡使用 shell 而不是 GUI。目前它還沒有提供像語法高亮這樣的功能。

在項目中開始使用 ArangoDB 的時候,你會尋找官方或社區(qū)使用與項目相同語言編寫的驅(qū)動。驅(qū)動實現(xiàn)了可以在項目編程語言中輕松使用的編程接口,與服務(wù)器進(jìn)行完全地交互。因此,除非你想自己寫驅(qū)動或者直接使用原始接口,否則理所當(dāng)然地,應(yīng)該忽略 HTTP API。

為了熟悉數(shù)據(jù)庫系統(tǒng)你可以將驅(qū)動放置一邊而使用 web 界面 (代碼名 Aardvark) 進(jìn)行基本交互. web 界面將會在你啟動 arangod 之后變?yōu)榭捎? 你可以在瀏覽器中通過 http://localhost:8529 進(jìn)行訪問 – 如果不可以,請查看 故障排除.

默認(rèn)情況下, 驗證已啟用. 默認(rèn)用戶為 root. 依據(jù)所用的安裝方法,安裝過程會提示輸入 root 密碼或者默認(rèn) root 密碼為空 (參看 以上).

 

接下來你會被詢問使用哪個數(shù)據(jù)庫。所有的服務(wù)器實例帶有一個 _system 數(shù)據(jù)庫. 選擇該數(shù)據(jù)庫并繼續(xù).

 

然后你會看到如下的服務(wù)器統(tǒng)計面板:

 

要了解關(guān)于接口的更詳細(xì)描述,參看 Web Interface.

數(shù)據(jù)庫,集合與文檔

數(shù)據(jù)庫是集合的集合. 集合存儲記錄, 記錄被稱為文檔. 集合等價于 RDBMS 中的表, 而文檔可以被認(rèn)為是表中的行. 區(qū)別在于你不需要預(yù)先定義有哪些列 (或者屬性). 任意集合中的所有文檔可以擁有任意的屬性鍵與值. 然而實際上一個集合中的文檔具有相似的結(jié)構(gòu), 但是數(shù)據(jù)庫系統(tǒng)本身并不會關(guān)心,無論你的數(shù)據(jù)是什么樣子,數(shù)據(jù)庫系統(tǒng)都會在其上執(zhí)行穩(wěn)定而快速的操作.

現(xiàn)在你可以停留在默認(rèn)的 _system 數(shù)據(jù)庫中并使用 web 接口來創(chuàng)建集合與文檔. 點擊 COLLECTIONS 菜單項, 然后選擇 Add Collection 菜單. 為其指定一個名字,例如 users, 保持其他的設(shè)置不變 (我們希望它是一個文檔集合) 并保存. 會出現(xiàn)一個標(biāo)記為 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è)的圖標(biāo)添加一個自定義屬性, 然后 添加. 兩個文本輸入框會變得可用, FIELD (屬性鍵) 與 VALUE (屬性值). 輸入名字作為鍵,輸入你的名字作為值. 添加 另一個屬性,將其命名為年齡,并將其設(shè)置為你的年齡. 點擊保存來保存這些修改. 如果你點擊 ArangoDB 圖標(biāo)右側(cè)頂點的集合: users , 文檔瀏覽器將會顯示 users 集合中的文檔,而你可以在列表中看到你剛剛創(chuàng)建的文檔.

查詢數(shù)據(jù)庫

是時候通過AQL(ArangoDB’ query language)ArangoDB查詢語言來取得我們的文檔了。我們可以直接通過我們創(chuàng)建的_id屬性查找文檔(當(dāng)然我們還可以使用其它選項)。點擊QUERIES菜單欄來顯示query editor(查詢編輯器)輸入以下的內(nèi)容(具體取決于你的document ID):

  1. RETURN DOCUMENT("users/9883"

然后點擊Execute來啟動查詢,結(jié)果如下所示:

  1.   { 
  2.     "_key""9883"
  3.     "_id""users/9883"
  4.     "_rev""9883"
  5.     "age": 32, 
  6.     "name""John Smith" 
  7.   } 
  8.  

結(jié)果出現(xiàn)在編輯器下方。如你所見,程序返回了整個文檔,包含著系統(tǒng)屬性。DOCUMENT() 函數(shù)會根據(jù)你提供的_keys或者_(dá)ids返回一系列或者單個文檔。我們管返回的結(jié)果叫做查詢結(jié)果,它是一個數(shù)組,包含了我們的文檔查詢結(jié)果(我們可能會得到不只一個文檔,但是即使只有一個文檔結(jié)果,它仍然會返回最上層的數(shù)組)。

這種類型的查詢稱為數(shù)據(jù)訪問查詢。這種查詢不會創(chuàng)建、更改或刪除數(shù)據(jù)。還有另一種類型的查詢,稱為數(shù)據(jù)修改查詢。讓我們使用修改查詢插入第二個文檔:

  1. INSERT { name"Katie Foster", age: 27 } INTO users 

查詢非常容易看懂: INSERT 關(guān)鍵詞告訴ArangoDB我們想插入一些東西。后面緊跟著的是我們要插入的東西,在這個案例中是一個擁有兩個屬性的文檔。 花括號{ } 表示文件,或者說是對象。我們所說的文件是指集合中的記錄。當(dāng)用JSON編碼時,我們叫它對象。對象也可以嵌套。下面舉個例子:

  1.   "name": { 
  2.     "first""Katie"
  3.     "last""Foster" 
  4.   } 
  5.  

INTO 必須跟在每一個 INSERT 操作后面,后面再接上我們儲存文檔的集合的名字。注意集合的名字不必加上引號。

如果你運行上面的查詢語句,會返回一個空數(shù)組,因為你沒有用 RETURN 關(guān)鍵詞指定要返回的內(nèi)容。 RETURN 關(guān)鍵詞在修改查詢中是可選項,但在數(shù)據(jù)訪問查詢中是必選項。就算用上 RESULT,返回值也可能是空數(shù)組,比如制定文檔無法找到的情況。盡管結(jié)果為空,以上的查詢?nèi)匀粫?chuàng)建新用戶文件。你可以在文檔瀏覽器中驗證這一點。

這一次我們新建一個用戶,并且讓新的結(jié)果返回。

  1. INSERT { name"James Hendrix", age: 69 } INTO users 
  2.  
  3. RETURN NEW  

NEW 是一個虛擬變量,指的是用INSERT語句新建的文檔。查詢結(jié)果如下:

  1.   { 
  2.     "_key""10074"
  3.     "_id""users/10074"
  4.     "_rev""10074"
  5.     "age": 69, 
  6.     "name""James Hendrix" 
  7.   } 
  8.  

現(xiàn)在我們一個有三個用戶了。如何用一條語句返回全部數(shù)據(jù)呢?下面的方法不起作用:

  1. RETURN DOCUMENT("users/9883"
  2.  
  3. RETURN DOCUMENT("users/9915"
  4.  
  5. RETURN DOCUMENT("users/10074" 

這里僅有一條 RETURN 語句,如果你嘗試執(zhí)行,則會拋出系統(tǒng)錯誤. DOCUMENT() 函數(shù)提供了一個補(bǔ)充簽名來指定多文檔處理,所以我們可以:

  1. RETURN DOCUMENT( ["users/9883""users/9915""users/10074"] ) 

所有3個文檔的帶有 _ids 的數(shù)組會被傳遞給函數(shù). 數(shù)組通過方括號 [ ] 表示,而其元素使用逗號進(jìn)行分隔.

但是如果我們添加更多用戶會怎樣呢? 我們同時需要修改查詢來獲取新添加的用戶. 關(guān)于我們的查詢,我們希望表達(dá)的是: “對于 users 集合中的每一個用戶, 返回用戶文檔”. 我們可以使用 FOR 循環(huán)格式化該查詢:

  1. FOR user IN users 
  2.  
  3. RETURN user  

它表達(dá)的是對 users 中的所有文檔進(jìn)行迭代并使用user 作為變量名, 從而我們可以用來指代當(dāng)前用戶文檔. 它可以被稱為 doc, u 或 ahuacatlguacamole, 這取決于你. 然而建議使用一個簡短并自描述的名字.

循環(huán)體告訴系統(tǒng)返回變量 user 的值, 這是一個用戶文檔. 可以像下面這樣返回所有用戶文檔:

  1.   { 
  2.     "_key""9915"
  3.     "_id""users/9915"
  4.     "_rev""9915"
  5.     "age": 27, 
  6.     "name""Katie Foster" 
  7.   }, 
  8.   { 
  9.     "_key""9883"
  10.     "_id""users/9883"
  11.     "_rev""9883"
  12.     "age": 32, 
  13.     "name""John Smith" 
  14.   }, 
  15.   { 
  16.     "_key""10074"
  17.     "_id""users/10074"
  18.     "_rev""10074"
  19.     "age": 69, 
  20.     "name""James Hendrix" 
  21.   } 
  22.  

也許你已經(jīng)注意到返回的文檔順序與插入順序并不相同. ArangoDB 并不保證文檔順序,除非你顯式對其進(jìn)行排序. 我們可以很容易添加了一個 SORT 操作:

  1. FOR user IN users 
  2.  
  3. SORT user._key 
  4.  
  5. RETURN user  

這依然不會返回預(yù)期的結(jié)果: James (10074) 會在 John (9883) 與 Katie (9915) 之前返回. 原因在于 _key 屬性在 ArangoDB 中是一個字符串,而不是一個數(shù)字. 字符串的單個字符會被進(jìn)行比較. 1 小于 9 ,因而結(jié)果是 “正確”的. 如果我們希望使用數(shù)值作為 _key 屬性的值,我們可以將字符串轉(zhuǎn)換為數(shù)字并用其進(jìn)行排序. 然而這樣做有一些影響T. 我們***排序其他內(nèi)容. 年齡怎么樣?以降序排列嗎?

  1. FOR user IN users 
  2.  
  3. SORT user.age DESC 
  4.  
  5. RETURN user  

用戶的數(shù)據(jù)會以如下的順序返回: James (69), John (32), Katie (27)。與用DESC返回降序結(jié)果不同, ASC返回升序結(jié)果。 ASC是默認(rèn)的選項,可以省略。

我們可能需要根據(jù)用戶的年齡返回一個子集。讓我們返回30歲以上的用戶的數(shù)據(jù):

  1. FOR user IN users 
  2.  
  3. FILTER user.age > 30 
  4.  
  5. SORT user.age 
  6.  
  7. RETURN user  

這么做會按順序返回John and James。 Katie’s age的屬性不滿足三十歲以上的條件,她只有27歲,因此不再結(jié)果之中。我們可以修改她的年齡,使她重新包含在返回結(jié)果之中,使用如下的查詢語句:

  1. UPDATE "9915" WITH { age: 40 } IN users 
  2.  
  3. RETURN NEW  

UPDATE 允許部分編輯已存在的文檔. 另外有 REPLACE, 會移除所有屬性 (除了 _key 與 _id 保持不變) 并且僅添加部分屬性. 另一方面 UPDATE 替換指定的屬性而保持其他屬性不變.

UPDATE 關(guān)鍵字后跟文檔鍵 (或者帶有 _key 屬性的文檔 / 對象) 來指定要修改的文檔. 要更新的屬性作為對象使用 WITH關(guān)鍵字寫入. IN 表示在哪個集合中執(zhí)行該操作, 類似 INTO (這里兩個關(guān)鍵字可以互換). 如果我們使用 NEW 偽變量則會返回應(yīng)用修改的全部文檔:

  1.   { 
  2.     "_key""9915"
  3.     "_id""users/9915"
  4.     "_rev""12864"
  5.     "age": 40, 
  6.     "name""Katie Foster" 
  7.   }  

相反如果我們使用 REPLACE , name 屬性會丟失. 使用 UPDATE, 屬性會被保留 (如果我們有其他的屬性,也同樣適用該規(guī)則).

讓我們再次運行 FILTER 查詢, 但是這一次僅返回用戶名:

  1. FOR user IN users 
  2.  
  3. FILTER user.age > 30 
  4.  
  5. SORT user.age 
  6.  
  7. RETURN user.name  

這會返回所有3個用戶的名字:

  1.  
  2. "John Smith"
  3.  
  4. "Katie Foster"
  5.  
  6. "James Hendrix" 
  7.  
  8.  

如果僅返回一個屬性的子集,則將其稱為投影. 另一種投影類型是改變結(jié)果的結(jié)構(gòu):

  1. FOR user IN users 
  2.  
  3. RETURN { userName: user.name, age: user.age }  

該查詢?yōu)樗械挠脩粑臋n定義了輸出格式. 用戶名作為 userName 返回,而不是 name, 在該示例中 age 與屬性性鍵相同:

  1.   { 
  2.     "userName""James Hendrix"
  3.     "age": 69 
  4.   }, 
  5.   { 
  6.     "userName""John Smith"
  7.     "age": 32 
  8.   }, 
  9.   { 
  10.     "userName""Katie Foster"
  11.     "age": 40 
  12.   } 

也可以計算新值:

  1. FOR user IN users 
  2.  
  3. RETURN CONCAT(user.name"'s age is "user.age)  

CONCAT() 是一個將元素合并為字符串的函數(shù). 在這里我們用其為所有用戶返回一個描述. 正如你看到的,結(jié)果集合并不總是一個對象數(shù)組:

  1.  
  2. "James Hendrix's age is 69"
  3.  
  4. "John Smith's age is 32"
  5.  
  6. "Katie Foster's age is 40" 
  7.  
  8.  

現(xiàn)在讓我們來做一些瘋狂的事情: 對于用戶集合中的所有文檔,再次對所有用戶文檔進(jìn)行迭代并返回用戶組合,例如 John 與 Katie. 對于該問題,我們可以在一個循環(huán)內(nèi)部使用一個循環(huán)來獲得叉積 (所有用戶記錄的所有可能組合, 3 3 = 9). 然而我們并不希望得到類似 John + John* 的組合, 所以讓我們使用一個過濾器條件來去除類似的組合:

  1. FOR user1 IN users 
  2.  
  3. FOR user2 IN users 
  4.  
  5. FILTER user1 != user2 
  6.  
  7. RETURN [user1.name, user2.name 

我們得到6對組合。類似 James + John 與 John + James 的組合是重復(fù)的,但是已足夠好:

  1.   [ "James Hendrix""John Smith" ], 
  2.   [ "James Hendrix""Katie Foster" ], 
  3.   [ "John Smith""James Hendrix" ], 
  4.   [ "John Smith""Katie Foster" ], 
  5.   [ "Katie Foster""James Hendrix" ], 
  6.   [ "Katie Foster""John Smith" ] 
  7.  

我們可以像下面這樣計算兩個年齡之和并計算一些新的內(nèi)容:

  1. FOR user1 IN users 
  2.   FOR user2 IN users 
  3.     FILTER user1 != user2 
  4.     RETURN { 
  5.         pair: [user1.name, user2.name], 
  6.         sumOfAges: user1.age + user2.age 
  7.     }  

我們引入一個新的屬性 sumOfAges 并將兩個年齡相加作為其值:

  1.   { 
  2.     "pair": [ "James Hendrix""John Smith" ], 
  3.     "sumOfAges": 101 
  4.   }, 
  5.   { 
  6.     "pair": [ "James Hendrix""Katie Foster" ], 
  7.     "sumOfAges": 109 
  8.   }, 
  9.   { 
  10.     "pair": [ "John Smith""James Hendrix" ], 
  11.     "sumOfAges": 101 
  12.   }, 
  13.   { 
  14.     "pair": [ "John Smith""Katie Foster" ], 
  15.     "sumOfAges": 72 
  16.   }, 
  17.   { 
  18.     "pair": [ "Katie Foster""James Hendrix" ], 
  19.     "sumOfAges": 109 
  20.   }, 
  21.   { 
  22.     "pair": [ "Katie Foster""John Smith" ], 
  23.     "sumOfAges": 72 
  24.   } 
  25.  

如果我們希望過濾新屬性來僅返回總和小于100的組合,我們應(yīng)該定義一個變量來臨時存儲總和,從而我們可以在 FILTER 語句以及 RETURN 語句中使用:

  1. FOR user1 IN users 
  2.   FOR user2 IN users 
  3.     FILTER user1 != user2 
  4.     LET sumOfAges = user1.age + user2.age 
  5.     FILTER sumOfAges < 100 
  6.     RETURN { 
  7.         pair: [user1.name, user2.name], 
  8.         sumOfAges: sumOfAges 
  9.     }  

LET 關(guān)鍵字后跟指定的變量名 (sumOfAges), 然后是 = 符號與值或表達(dá)式來定義變量的值. 在這里我們重用我們的表達(dá)式來計算總和. 然后我們使用另一個 FILTER 來略過不需要的組合并使用我們之前聲明的變量. 我們使用用戶名與所計算的年齡值的數(shù)組返回一個投影,為些我們再次使用變量:

  1.   { 
  2.     "pair": [ "John Smith""Katie Foster" ], 
  3.     "sumOfAges": 72 
  4.   }, 
  5.   { 
  6.     "pair": [ "Katie Foster""John Smith" ], 
  7.     "sumOfAges": 72 
  8.   } 
  9.  

小貼士: 當(dāng)定義對象時, 如果所要求的屬性鍵與屬性值所用的變量相同i, 你可以使用簡寫形式: { sumOfAges } 替代 { sumOfAges: sumOfAges }.

***,讓我們刪除一個用戶文檔:

  1. REMOVE "9883" IN users 

它會刪除用戶 John (_key: “9883”). 我們也可以在循環(huán)中移除文檔 (同樣適用于 INSERT, UPDATE 與 REPLACE):

  1. FOR user IN users 
  2.     FILTER user.age >= 30 
  3.     REMOVE user IN users  

該查詢會刪除年齡大于等于 30 的所有用戶.

如何繼續(xù)

在AQL 中可探索更多內(nèi)容以及 ArangoDB 提供的更多功能. 繼續(xù)閱讀其他章節(jié)并使用測試數(shù)據(jù)庫試驗以促進(jìn)你的知識.

如果你希望立即編寫更多的 AQL 查詢,請查看:

  • 數(shù)據(jù)查詢: 數(shù)據(jù)訪問與修改查詢
  • 高級操作: FOR, FILTER 的詳細(xì)描述以及該簡介中未涉及的更多操作
  • 函數(shù): 所提供函數(shù)的參數(shù)

ArangoDB程序

ArangoDB包有以下程序:

  • arangod: ArangoDB數(shù)據(jù)庫守護(hù)進(jìn)程. 此服務(wù)器程序旨在作為守護(hù)程序進(jìn)程運行,并通過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基準(zhǔn)測試工具。 它可以用于性能和服務(wù)器功能測試。 
責(zé)任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2011-07-19 09:08:50

JavaNoSQL

2024-02-02 10:51:53

2023-07-28 08:27:03

MongoDB數(shù)據(jù)庫

2019-03-20 14:44:53

數(shù)據(jù)庫MySQLExcel

2021-09-28 09:25:05

NoSQL數(shù)據(jù)庫列式數(shù)據(jù)庫

2011-10-09 09:38:03

OracleNoSQL

2019-07-08 10:36:34

數(shù)據(jù)庫WebNoSQL

2019-03-20 15:59:11

NoSQLRedis數(shù)據(jù)庫

2010-04-01 09:45:38

NoSQL

2024-03-28 09:00:00

NoSQL數(shù)據(jù)庫

2023-12-19 09:36:35

PostgreSQL數(shù)據(jù)庫開源

2011-04-14 11:14:21

OracleNoSQLMySQL

2011-07-13 09:58:15

HBase

2019-07-23 11:41:45

數(shù)據(jù)庫SQLDocker

2011-03-25 14:40:29

Trinity數(shù)據(jù)庫

2014-02-27 10:08:33

NoSQL

2011-05-16 10:29:44

HandlerSockNoSQL

2023-03-05 16:25:38

NoSQL數(shù)據(jù)庫

2020-10-31 22:01:40

NoSQL數(shù)據(jù)庫

2010-08-13 16:40:27

CouchDBAndroid SDKAndroid
點贊
收藏

51CTO技術(shù)棧公眾號