2017-02-22 28 views
1

在CouchDB 2.0中,我試圖創建一個有序列表作爲來自View的鍵,但它不起作用。CouchDB 2.0 - 如何自動增加視圖中的鍵?

我對查看文檔代碼:

var i = 0; 
function (doc) { 
    if (doc.type === "comment") {  
    emit(i++, doc.webpages); 
    } 
} 

其結果是,所有的按鍵都等於0。我怎樣才能讓這個每個文檔獲取自動遞增的關鍵?
謝謝!

+1

你能提供一些背景知道你爲什麼要這麼做/你想如何使用它?你不能按照設計來做,因爲沒有範圍保存在你的函數之外。此外,任何給定的評論不保證視圖的多次運行具有相同的「我」值。 – sarwar

+0

@sarwar我只是覺得這很容易做,但你現在解釋爲什麼它不是,*功能(doc)*之外沒有範圍。這很有道理,但你確定嗎?我想創建一個有序列表,但也許我可以簡單地使用View檢索一個列表,並使用'?startkey = x'和'endkey = x + 3'來獲取索引片。順便說一句,我還在學習CouchDB,所以現在我沒有真正的項目,我只是在玩它 – flen

+0

我已經添加了一個答案,顯示我使用密鑰的典型方法。多部分的鍵是你的朋友。 – sarwar

回答

1

順序標識可能不是大多數實際應用程序的最佳選擇。舉例來說,如果你要建立一個評論系統我想接近它像這樣(有在沙發上的文檔一similar example):

評論將與這樣的結構文檔:

{ 
    "_id": "comment_id", 
    "parent":"comment_id, or article_id if a top level comment" 
    "timestamp" : "iso datetime populated by the server", 
    "user_id": "the person who wrote the comment", 
    "content": "content of the comment" 
} 

要顯示所有給定父(無論是文章或父評論)的頂級評論,你可以使用這樣一個觀點:

def function(doc){ 
    emit([doc.parent, doc.timestamp, doc.user_id], doc._id) 
} 

高效地查詢此,你可以使用下面的query options搶前二十:

{ 
    "startkey": ["parent_id"], 
    "endkey": ["parent_id", {}], 
    "limit": 20, 
    "skip": 0, 
    "include_docs": true 
} 

評論會根據發佈日期自動排序,因爲該視圖是按[parent,datetime,然後是user]排序的。除了家長之外,您沒有通過任何價值來獲取這個價值。

另一件值得注意的事情是不通過評論的內容到視圖,而是使用include_docs,您的索引將保持儘可能苗條。

進一步來說:

  • 如果你想顯示答覆基地評論,你可以改變 開始和結束鍵,該評論的ID。
  • 如果您想顯示接下來的20條評論,只需更改跳至20.
  • 如果您想要顯示最初顯示的更多評論,只需提高限制值即可。

在回答您的意見,如果你有一個數組或父母文檔中一樣:別人

"parents" : ["a100", "a101", "a102"] 

一切都將保持不變,除非你將發射一排每個父。

def function(doc){ 
    doc.parents.map(function (parent){ 
    emit([doc.parent, doc.timestamp, doc.user_id], doc._id) 
    }); 
} 
+0

優秀的答案!你說得對,我可以簡單地根據文檔的屬性構建列表。但在索引方面,我能否提出另一個問題?假設同樣的評論出現在3篇文章中(我知道,不是博客的例子),如果我使用這樣一個數組作爲字段「parent」:'「parent」:[4,70,103]',這個數組中的索引如果我想要檢索屬於'post_id'70的所有註釋,是否有效(如果我做了一個View來發出這個字段)?你會建議在這種情況下更好的解決方案?你是如何通過文檔學習CouchDB的? – flen

+1

該方法將是相同的,除非您從單個評論文檔發出多行。我更新了我的答案。我通過使用它學會了沙發。文檔是足夠的,但相當簡單。這個網站有一些關於更高級用法的很好的問題和答案。大部分挑戰是理解如何很好地使用map-reduce。由於有其他查詢方法,因此使用CouchDB 2.0就不是什麼問題。 – sarwar