2015-10-27 57 views
2

我以下面的格式將JSON數據存儲在ArangoDB集合中。使用AQL迭代查詢ArangoDB

{ 
    "data": { 
    "1": [ {"db_name": "DSP"}, {"rel": "2"} ], 
    "2": [ {"rel_name": "DataSource"}, {"tuple": "201"}, {"tuple": "202"}, {"tuple": "203"} ], 
    "201": [ {"src_id": "Pos201510070"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151007"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "postgres"}, {"port": "None"} ], 
    "202": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"},{"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "DSP"}, {"port": "5432"} ], 
    "203": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"},{"src_type": "Structured"},{"db_name": "maindb"},{"port": "5432"} ] 
    } 
} 

我是新來的ArangoDB。我不知道存儲和查詢來自ArangoDB的數據。在我的數據中沒有任何預定義的密鑰,數據會隨着時間填充。我的數據就像一個半結構化的數據,它沒有任何固定數量的屬性,並且由於其迭代列表結構而有點複雜。

首先,任何人都可以建議我在ArangoDB中存儲上述格式的最佳方式。第二,我想通過以下方式查詢這些數據:通過指定任何鍵(事先不知道,通過在運行時指定它),或指定鍵和值對的組合,例如Key1 == value1或組合使用AND或OR邏輯運算符如Key1 == value1 AND Key2 == value2 OR Key3== value3

那麼,我們如何迭代上述數據呢?

+0

我已經試過查詢「爲了在Collecton_name中返回u」這就像使用select * from table_name查詢關係數據一樣; –

+1

實際上需要什麼樣的查詢結果有點不清楚。例如,要迭代每個文檔中的所有屬性,可以在AQL中使用嵌套的FOR循環,如下所示:FOR DOC IN集合LET attributes = ATTRIBUTES(doc.data)FOR屬性IN屬性RETURN {key:attribute,value:doc .data [屬性]}' – stj

+0

我想只訪問那些其中db_name ==「main_db」或我想要列表中的屬性名稱對應的值,如src_type等.. –

回答

1

如果您確實想將數據存儲在像這樣的結構中,而沒有任何預定義的屬性名稱,則仍然可以通過將數據轉換爲標準化結構來即時迭代數據。

以下AQL查詢創建鍵/值對每個文檔的平面列表:

FOR doc IN collection 
    LET attributes = ATTRIBUTES(doc.data) 
    FOR attribute IN attributes 
    FOR arrayItem IN doc.data[attribute] 
     LET key = ATTRIBUTES(arrayItem)[0] 
     LET value = arrayItem[key] 
     RETURN { _key: doc._key key: key, value: value } 

此查詢的結果將是這樣的:

[ 
    { 
    "_key" : "864582648369", 
    "key" : "password", 
    "value" : "root" 
    }, 
    { 
    "_key" : "864582648369", 
    "key" : "db_name", 
    "value" : "postgres" 
    }, 
    { 
    "_key" : "864582648369", 
    "key" : "port", 
    "value" : "None" 
    }, 
    ... 
] 

現在,你可以申請通過添加篩選條件可輕鬆篩選首選條件:

FOR doc IN collection 
    LET attributes = ATTRIBUTES(doc.data) 
    FOR attribute IN attributes 
    FOR arrayItem IN doc.data[attribute] 
     LET key = ATTRIBUTES(arrayItem)[0] 
     LET value = arrayItem[key] 
     FILTER key == 'password' || key == 'port' || (key == 'db_name' && value == 'postgres') 
     RETURN { _key: doc._key, key: key, value: value } 

備註當數據結構發生變化時(更多/更少的嵌套層次),上述內容將不再適用。該查詢假定文檔具有問題中提供的結構。

+0

Thanx stj ....,請你指導我如何刪除有關更多/更少的嵌套層次的限制...... –

+0

有什麼辦法可以消除這個限制嗎? –

+0

,你可以建議我爲我作爲ArangoDB的初學者一些很好的教程? –