2015-11-19 91 views
0

有沒有辦法在ArangoDB中獲取特定文檔的索引,以便在LIMIT操作中使用它?舉例來說,假設我被它的ID查找文檔,發現它的指數是534,然後我會使用這樣的:ArangoDB獲取文檔索引

LIMIT 534, 30 

...我看了文件後,返回下一個30個文件向上。但我似乎無法找到一種方法來使用AQL獲取文檔的索引...

回答

1

問題是什麼下一個文檔實際上應該是什麼意思。

如果下一個這裏指文件鍵索引順序

的文檔沒有特別的「命令」或「指數」的集合內。集合中的文檔按未排序主索引中的_key/_id屬性組織。

要獲得下一個文檔鍵(讓我們假設按字典排序的鍵),必須讀取集合的所有鍵,對它們進行排序並以某種方式找到當前文檔的索引以獲得下一個鍵。這將是非常低效的。

集合上的其他索引是可選的,因此不能依賴它們存在並可用於此類查詢。

如果下一個在這裏是指插入或更新的命令,那麼也沒有合理的辦法讓到下一個文件。

一種解決辦法可能是使用上的一些文件屬性,非常獨特的一個排序(即skiplist)指數,並填充它時,如果文件中插入(也許更新,如果更新也應該改變的順序一個文件)。

然後找到下一個文件,這樣做:

  • 先找到其_id_key需要的文件,文檔數據提取到應用

  • 提取文檔屬性對其進行排序的索引,並將其用於後續的AQL查詢中,如下所示:

這將讓你找到下原來的文件,但是,你必須以某種方式維持秩序屬性:

這將是很容易做到,如果你的文檔具有可用於某些屬性無論如何要訂購,但如果它們沒有這種屬性,它將是一個笨拙的解決方案。

+0

問題是我按不同的,並不總是唯一的屬性排序。例如按客戶名稱排序。目標是根據客戶名稱加載前30條記錄,比方說「ABC」,然後加載下一組。需要注意的是,Arango中的數據是由多個用戶同時編輯的,並且該應用程序是實時的,所以當我去請求下一個「塊」時,我的原始查詢記錄可能會發生變化。另一個問題是可能有超過30個「ABC」記錄,所以我不能使用FILTER doc.cName> @value,因爲它可能會跳過一些「ABC」記錄......任何想法? – skinneejoe

+0

如果在唯一屬性(例如'_key')上添加另一個FILTER條件:'FILTER doc.cName> @value && doc._key> @ lastKey',您可以避免在存在許多重複項時跳過記錄。即使有許多記錄匹配'cName ==「ABC'」,這也應該可以工作。 – stj

+0

偉大我會給它一個鏡頭,謝謝! – skinneejoe

0

如果您不應用anny排序過濾器,ArangoDB不會拒絕特殊序列。

所以,做

db._create("testCollection"); 
for (var i = 0; i < 10; i ++) db.testCollection.save({which: i}) 
db._query("FOR i IN testCollection RETURN i.which").toArray() 

會給你一個相當隨機序列。

db._query("FOR i IN testCollection SORT i.which RETURN i.which").toArray() 

會給你一個很好的結果。

然後你可以這樣做:

db._query("FOR i IN testCollection SORT i.which LIMIT 3, 5 RETURN i.which").toArray() 

與限制的工作。您也可以use cursorsfetch partial results