2016-04-15 23 views
1

我們使用一個CloudantDB作爲文檔存儲,包含我們想要處理的數據列表。如何將Cloudant(CouchDB)視爲文檔堆棧?

在運行時,我們基本上想要獲取一個文檔,對其進行處理,如果處理成功,則將其從數據庫中刪除。

我看到的唯一機制是要麼獲得整個文檔列表(這可能不適合我們,因爲它可能是一個非常大的列表),或單個文檔是我們有ID(我們贏了不必開始)。如果我正在處理一個傳統的SQL數據庫,那麼我可能會有一個遊標,當我想要處理一個文檔時,我只會推進它。

我對視圖很熟悉,但我不確定這有幫助。

我錯過了一些選擇嗎?

+0

請參閱下面的答案。如果還有其他限制阻止你這樣做,請更新你的問題,我會很樂意看一看。 – markwatsonatx

回答

4

從Cloudant中檢索文檔有很多選項。視圖是允許您查詢,排序和聚合文檔的基礎技術。在您的特定示例中,它聽起來像是您只想獲得最多(或最少)最近的文檔。你可以用視圖來做到這一點,或者在Cloudant中,你可以簡單地創建一個索引。

假設您有一個名爲create_date的日期字段。在Cloudant你可以創建一個索引像這樣(去查詢然後單擊編輯旁邊的「你可用索引」):

{ 
    "index": { 
    "fields": [ 
     "create_date" 
    ] 
    }, 
    "type": "json" 
} 

這將創建一個視圖,你會看到它在「設計文件」中。您可以按照以下方式在儀表板中查詢該視圖:

{ 
    "selector": { 
    "create_date": { 
     "$gt": 0 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev" 
    ], 
    "sort": [ 
    { 
     "create_date": "desc" 
    } 
    ], 
    "limit": 1 
} 

請注意,我已將我的查詢限制爲1個文檔。這將返回添加到Cloudant的最新文檔。要檢索添加到Cloudant的最早文檔,請將排序更改爲"create_date": "asc"

您可以使用HTTP POST調用/db/_find/在儀表板的外部運行此操作。請參閱此鏈接瞭解更多信息:

https://docs.cloudant.com/cloudant_query.html#finding-documents-using-an-index

更新:使用文本索引和書籤

上述方法假定你要刪除的每個文檔,每一次重新運行查詢。如果您使用升序排序,則始終按順序處理文檔,但如果使用降序排序,則可以在插入新文檔時處理它們。

另一種方法是使用書籤(如下面評論中的OP所建議的)。首先要在Cloudant中創建文本索引:

{ 
    "index": {}, 
    "type": "text" 
} 

運行與上面相同的查詢。現在的結果將包括類似於以下一個bookmarks場:

{ 
    "docs":[{ 
    "_id":"aa279ae2835f51d8ea13ee3e6ae3a210", 
    "_rev":"1-e90f3814f49b3e89158f8d2337de89cb"} 
    ], 
    "bookmark": "g1AAAAD4eJzLYWBgYM5gTmHQSElKzi9KdUhJMtRLytVNSczRLS5JzEtJLEox1EvOyS9NScwr0ctLLckB6mBKUgCSSfb____PAvPdHK_uzd_TwMCQKJ1Fuml5LECSYQGQAhq4H2HiAWEHoIkKaCaaE23iAYiJ9xEmHhY7AHZjFgAnFk_X" 
} 

在隨後的查詢,你可以通過書籤遍歷文件,以便:

{ 
    "selector": { 
    "create_date": { 
     "$gt": 0 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev" 
    ], 
    "sort": [ 
    { 
     "create_date": "desc" 
    } 
    ], 
    "limit": 1, 
    "bookmark" : "g1AAAAD4eJzLYWBgYM5gTmHQSElKzi9KdUhJMtRLytVNSczRLS5JzEtJLEox1EvOyS9NScwr0ctLLckB6mBKUgCSSfb____PAvPdHK_uzd_TwMCQKJ1Fuml5LECSYQGQAhq4H2HiAWEHoIkKaCaaE23iAYiJ9xEmHhY7AHZjFgAnFk_X" 
} 

更多關於書籤的信息可以在這裏找到:

https://docs.cloudant.com/cloudant_query.html#working-with-indexes

+0

哦,這可能工作。如何使用這個例子的書籤?我認爲這將幫助我基本上一次一個地通過所有文檔,並且當我到達最後時,我可以再次運行查詢以處理任何新的 – RedBullet

+0

書籤實際上不會與此示例一起工作,因爲他們只在文本索引上工作。理論上,如果您從最早的文檔開始,您可以簡單地刪除每個文檔並重新發出相同的查詢,並且您總是可以按順序進行。如果您不想刪除文檔,則可以在循環查看文檔時添加skip參數。我將嘗試使用帶書籤的文本索引來構建一個示例。 – markwatsonatx

+0

使用書籤在上面添加了一個示例。 – markwatsonatx

0

好吧,這裏是你如何能做到你想要的。據我所知,你可能有一個觀點,你可以取。

如果視圖沒有太多重複的鍵,那應該不成問題。如果您有重複的鍵,您可以在視圖發出的鍵中添加doc.id。

你所要做的就像你會做某種光標......獲取整個列表顯然不是一個好主意,但是獲取2個文檔不應該那麼糟糕。

首先,取2個第一個文件。第二個文檔需要用作我們的下一個抓取指針。

處理您的文檔並從couchdb中刪除它。使用先前獲取的第二個文檔的鍵並獲取下一個文檔。您可以添加skip = 1以不獲取已獲取的文檔。

http://url?start_key=previous_doc&limit=1&skip=1 
相關問題