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

View CouchDB 2.0-如何在视图中自动增加键?,view,key,couchdb,auto-increment,View,Key,Couchdb,Auto Increment,在CouchDB 2.0中,我试图创建一个有序列表作为视图中的键,但它不起作用 查看文档的我的代码: var i = 0; function (doc) { if (doc.type === "comment") { emit(i++, doc.webpages); } } 结果是所有键都等于0。如何使每个文档都获得一个自动递增键? 谢谢 对于大多数实际应用程序,顺序ID可能不是最佳选择。例如,如果您要构建一个评论系统,我会这样处理它(沙发文档中有一个): 注释将是具有

在CouchDB 2.0中,我试图创建一个有序列表作为视图中的键,但它不起作用

查看文档的我的代码:

var i = 0;
function (doc) {
  if (doc.type === "comment") {    
    emit(i++, doc.webpages);
  }
}
结果是所有键都等于0。如何使每个文档都获得一个自动递增键?

谢谢

对于大多数实际应用程序,顺序ID可能不是最佳选择。例如,如果您要构建一个评论系统,我会这样处理它(沙发文档中有一个):

注释将是具有如下结构的文档:

{
    "_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)
}
要显示给定父级的所有顶级注释(文章或父级注释),可以使用如下视图:

{
    "_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)
}
要高效地查询此信息,您可以使用以下内容获取前20个:

{
    "startkey": ["parent_id"],
    "endkey": ["parent_id", {}],
    "limit": 20,
    "skip": 0,
    "include_docs": true
}
评论将按发布日期自动排序,因为视图是按[parent,datetime,然后是user]排序的。除了使用密钥传递父项之外,您没有传递值的权限,因此无法从中获益

另一件值得注意的事情是,不要将注释的内容传递给视图,而是使用include_docs,您的索引将保持尽可能细

要进一步说明这一点:

  • 如果您想显示对基本评论的回复,只需更改 注释id的开始键和结束键
  • 如果您想显示接下来的20条评论,只需将skip更改为20
  • 如果希望最初显示更多注释,只需增加限制值即可
在回答您的评论时,如果您的文档中有一个数组或父对象,如:

"parents" : ["a100", "a101", "a102"]
除为每个父对象发出一行外,其他所有内容都将保持不变

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

你能提供一些你为什么要这样做/你想如何使用它的上下文吗?你不能按设计去做,因为没有任何作用域被保留在你的功能之外。此外,任何给定的注释都不能保证在多次运行视图时具有相同的“i”值。@sarwar我只是认为这样做很容易,但您现在解释了为什么不这样做,因为函数(doc)之外没有作用域。这是有道理的,但你确定吗?我想创建一个有序列表,但也许我可以简单地用视图检索一个列表,并使用
?startkey=x
endkey=x+3
获取索引切片。顺便说一句,我还在学习CouchDB,所以现在我没有真正的项目,我只是在玩它。我已经添加了一个答案,显示了我使用键的典型方法。多部件钥匙是你的朋友。回答得很好!你说得对,我可以简单地根据文档的属性构建列表。但关于索引,我可以提出另一个问题吗?假设相同的评论出现在3篇文章中(我知道,不是一个博客示例),如果我对
parent
字段使用如下数组:
“parent”:[4,70103]
,如果我想检索属于
post\u id
70的所有评论,该数组中的索引是否有效(如果我查看该字段)?在这种情况下,你能提出更好的解决方案吗?您是如何仅通过文档学习CouchDB的?方法是相同的,只是您将从一个注释文档中发出多行。我更新了我的答案。我用它学会了沙发。这些文档足够了,但相当简单。这个网站有一些关于更高级用法的很好的问题和答案。最大的挑战是理解如何很好地使用map reduce。在CouchDB 2.0中,由于还有其他查询方法,所以问题不大。