【问题标题】:CouchDB 2.0 - How to autoincrement keys in a View?CouchDB 2.0 - 如何在视图中自动增加键?
【发布时间】:2017-02-22 21:47:38
【问题描述】:

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

我的查看文档代码:

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

结果是所有键都等于 0。我怎样才能使每个文档都获得一个自动递增的键?
谢谢!

【问题讨论】:

  • 您能否提供一些背景信息来说明您为什么要这样做/您想如何使用它?您无法按设计执行此操作,因为您的功能之外没有任何范围。此外,任何给定的评论都不能保证在视图的多次运行中具有相同的“i”值。
  • @sarwar 我只是认为这很容易做到,但你现在解释了为什么不这样做,函数(doc)之外没有范围。这是有道理的,但你确定吗?我想创建一个有序列表,但也许我可以简单地使用 View 检索一个列表并使用 ?startkey=xendkey=x+3 来获取索引切片。顺便说一句,我还在学习 CouchDB,所以现在我还没有真正的项目,我只是在玩它
  • 我添加了一个答案,展示了我使用密钥的典型方法。多部分键是您的朋友。

标签: view key couchdb auto-increment


【解决方案1】:

顺序 ID 可能不是大多数实际应用程序的最佳选择。例如,如果您要构建一个评论系统,我会这样处理(沙发文档中有 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"
}

要显示给定父级的所有顶级 cmets(文章或父级评论),您可以使用如下视图:

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
}

cmets 将自动按发布日期排序,因为视图按 [父级、日期时间和用户] 排序。您没有为父母以外的任何东西传递值,您的密钥可以从中受益。

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

对此进行扩展:

  • 如果您想显示对基本评论的回复,您只需更改 该评论 ID 的开始键和结束键。
  • 如果要显示接下来的 20 个 cmets,只需将 skip 更改为 20。
  • 如果您希望最初显示更多 cmets,只需提高限值即可。

在回答您的评论时,如果您的文档中有数组或父级,例如:

"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],那么这个数组中的索引是否有效(如果我执行 View发出这个字段)如果我想检索所有属于post_id 70 的cmets?在这种情况下,您会建议更好的解决方案吗?您是如何仅通过文档学习 CouchDB 的?
  • 方法是一样的,除了你会从一个评论文档中发出多行。我更新了我的答案。我通过使用它学会了沙发。文档足够了,但相当简单。这个网站有一些关于更高级用法的很好的问题和答案。最大的挑战是理解如何很好地使用 map-reduce。使用 CouchDB 2.0,这不是问题,因为还有其他查询方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2014-12-07
  • 1970-01-01
  • 2019-05-11
  • 2017-07-20
  • 2013-09-30
相关资源
最近更新 更多