CouchDB 2.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,您的索引将保持尽可能苗条。
进一步来说:
- 如果你想显示答复基地评论,你可以改变 开始和结束键,该评论的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)
});
}
优秀的答案!你说得对,我可以简单地根据文档的属性构建列表。但在索引方面,我能否提出另一个问题?假设同样的评论出现在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