2011-08-12 26 views
5

下使用mysql這將是:CouchDB中,最後得到10個文件

SELECT * FROM thetable ORDER BY id DESC LIMIT 10 

我怎樣才能做到這一點CouchDB中與「類型」的所有文件:「消息」? (不與拉型的所有文件:消息)

由於

回答

9

創建發射所有文檔ID的圖。視圖鍵將用於自動排序。因爲需要完整的文件http://host/yourdb/_design/yourdesigndoc/_view/viewname?limit=10&include_docs=true&descending=true

,我們沒有任何東西包括在視圖值:

function(doc) { 
    if(doc.type && doc.type === 'message'){ 
     emit(doc._id, null); 
    } 
} 

然後執行查詢。相反,我們添加include_docs=true來獲取視圖條目的每個完整文檔。

注意,也有一個內置的觀點,即不相同:http://host/yourdb/_all_docs?limit=10&include_docs=true&descending=true

PS:你應該知道的是CouchDB的默認使用的UUID作爲標識的事實,這會使分揀或多或少沒用,如果你真的想獲得最新的文檔。要麼提供您自己的增量ID(關於分發/複製?),要麼使用一個新字段來存儲文檔在視圖中創建和使用的時間。


如果您的文檔有created場(即UNIX時間戳,JavaScript的Date.now()或者甚至一個RFC 3339般的字符串),你可以建立在這些價值觀的指數。

這裏是基於時間的觀點:

function(doc) { 
    if(doc.type && doc.type === 'message' && doc.created){ 
     emit(doc.created, null); 
    } 
} 

請注意,我們也不會發射doc._id本身。但是,CouchDB會自動存儲doc._id,其中數據來自每個發出的鍵/值對,因此我們可以再次使用include_docs=true來獲取完整的文檔。

查詢http://host/yourdb/_design/yourdesigndoc/_view/viewname?limit=10&include_docs=true&descending=true

+0

謝謝你的回覆。但是,這樣做將返回包含type:message的10個最早的文檔。我需要10個最新的文件。我能想到這樣做的唯一方法是從每個文檔ID中取出最後的10個ID,然後直接用ID來調用文檔......它只是不覺得它是正確的方法它。 – Brian

+0

你讀過我的PS了嗎?這取決於你的doc._ids是如何生成/分配的。也許你必須切換到'descending = false'或者甚至添加一個生成到你的文檔的字段並使用它。 –

+0

哇,不,我發誓我一定曾嘗試過100次哈哈...不知道我在哪裏搞砸了。謝謝! – Brian

3

如果您的文檔的ID已經被增量,而不是CouchDB的默認的UUID,你甚至都不需要定義一個視圖,你可以使用默認的_all_docs視圖,例如

http://couchdb_host/your_db/_all_docs?limit=10&descending=true&include_docs=true