在CouchDB 2.0中,我試圖創建一個有序列表作爲來自View的鍵,但它不起作用。CouchDB 2.0 - 如何自動增加視圖中的鍵?
我對查看文檔代碼:
var i = 0;
function (doc) {
if (doc.type === "comment") {
emit(i++, doc.webpages);
}
}
其結果是,所有的按鍵都等於0。我怎樣才能讓這個每個文檔獲取自動遞增的關鍵?
謝謝!
在CouchDB 2.0中,我試圖創建一個有序列表作爲來自View的鍵,但它不起作用。CouchDB 2.0 - 如何自動增加視圖中的鍵?
我對查看文檔代碼:
var i = 0;
function (doc) {
if (doc.type === "comment") {
emit(i++, doc.webpages);
}
}
其結果是,所有的按鍵都等於0。我怎樣才能讓這個每個文檔獲取自動遞增的關鍵?
謝謝!
順序標識可能不是大多數實際應用程序的最佳選擇。舉例來說,如果你要建立一個評論系統我想接近它像這樣(有在沙發上的文檔一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,您的索引將保持儘可能苗條。
進一步來說:
在回答您的意見,如果你有一個數組或父母文檔中一樣:別人
"parents" : ["a100", "a101", "a102"]
一切都將保持不變,除非你將發射一排每個父。
def function(doc){
doc.parents.map(function (parent){
emit([doc.parent, doc.timestamp, doc.user_id], doc._id)
});
}
優秀的答案!你說得對,我可以簡單地根據文檔的屬性構建列表。但在索引方面,我能否提出另一個問題?假設同樣的評論出現在3篇文章中(我知道,不是博客的例子),如果我使用這樣一個數組作爲字段「parent」:'「parent」:[4,70,103]',這個數組中的索引如果我想要檢索屬於'post_id'70的所有註釋,是否有效(如果我做了一個View來發出這個字段)?你會建議在這種情況下更好的解決方案?你是如何通過文檔學習CouchDB的? – flen
該方法將是相同的,除非您從單個評論文檔發出多行。我更新了我的答案。我通過使用它學會了沙發。文檔是足夠的,但相當簡單。這個網站有一些關於更高級用法的很好的問題和答案。大部分挑戰是理解如何很好地使用map-reduce。由於有其他查詢方法,因此使用CouchDB 2.0就不是什麼問題。 – sarwar
你能提供一些背景知道你爲什麼要這麼做/你想如何使用它?你不能按照設計來做,因爲沒有範圍保存在你的函數之外。此外,任何給定的評論不保證視圖的多次運行具有相同的「我」值。 – sarwar
@sarwar我只是覺得這很容易做,但你現在解釋爲什麼它不是,*功能(doc)*之外沒有範圍。這很有道理,但你確定嗎?我想創建一個有序列表,但也許我可以簡單地使用View檢索一個列表,並使用'?startkey = x'和'endkey = x + 3'來獲取索引片。順便說一句,我還在學習CouchDB,所以現在我沒有真正的項目,我只是在玩它 – flen
我已經添加了一個答案,顯示我使用密鑰的典型方法。多部分的鍵是你的朋友。 – sarwar