CouchDB 2.0 - 如何自动增加视图中的键?

问题描述:

在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

顺序标识可能不是大多数实际应用程序的最佳选择。举例来说,如果你要建立一个评论系统我想接近它像这样(有在沙发上的文档一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