【问题标题】:Sorting CouchDB result by value按值对 CouchDB 结果进行排序
【发布时间】:2016-01-25 23:49:44
【问题描述】:

我是 CouchDB(和一般的 NoSQL)的新手,我正在创建一个简单的 Node.js + express + nano 应用程序来感受它。这是一个简单的书籍集合,包含两个字段,“标题”和“作者”。

示例文档:

{
   "_id": "1223e03eade70ae11c9a3a20790001a9",
   "_rev": "2-2e54b7aa874059a9180ac357c2c78e99",
   "title": "The Art of War",
   "author": "Sun Tzu"
}

减少功能:

function(doc) {
  if (doc.title && doc.author) {
    emit(doc.title, doc.author);
  }
}

由于 CouchDB 按键排序并支持“descending=true”查询参数,因此很容易在 UI 中实现一个过滤器来切换标题的排序顺序,这是我的结果集中的键。这是用户界面:

List of books with link to sort title by ascending or descending

但我完全不知道如何为作者字段执行此操作。

我见过this question,它帮助海报按数字减少值排序,我读过a blog post,它使用列表也按减少值排序,但我没有看到任何方法在没有 reduce 的情况下对字符串值执行此操作。

【问题讨论】:

  • 你到底想做什么?您想仅按作者对列表进行排序吗?
  • 我希望能够按标题或作者排序,最好在后续点击时在升序和降序之间切换。

标签: node.js sorting express couchdb couchdb-nano


【解决方案1】:

如果要按特定属性排序,则需要确保该属性是键(或者,如果是数组键,则为数组中的第一个元素)。

我建议使用排序键作为键,发出一个空值并使用include_docs 来获取完整的文档,以允许您在 UI 中显示多个属性(这也使反序列化的值保持一致,因此您不必无需更改根据排序顺序处理返回值的方式)。

您的地图功能将与以下一样简单。

按作者排序:

function(doc) {
  if (doc.title && doc.author) {
    emit(doc.author, null);
  }
}

按标题排序:

function(doc) {
  if (doc.title && doc.author) {
    emit(doc.title, null);
  }
}

现在您只需根据所选的排序顺序更改调用的视图,并确保在查询中使用include_docs=true 参数。

您也可以通过同时发射这两个视图来使用单个视图...

emit(["by_author", doc.author], null);
emit(["by_title", doc.title], null);

...然后使用复合键进行查询。

【讨论】:

  • 哦! 'include_docs' 是缺少的链接。我没有意识到我可以在只发出一个字段时返回整个文档。太棒了!
  • @SchattenJager 您还可以将整个文档作为值或任意值发出,例如emit(doc.author, [doc.author, doc.title])。但是,由于视图是在索引时编译并存储的,因此当您只需使用 include_docs 并将 null 存储在视图中时,这在磁盘空间方面是昂贵的。
  • 乍一看,感觉 CouchDB 的查询结构将受到限制(我的意思是,我想要做的事情如果使用 SQL 会超级简单),但你让我看到了它的灵活性有可能。我还将尝试使用相同视图的第二种方法。非常感谢!
  • 诚实吗?它仍然非常有限。它做得很好,但它肯定不适合每个用例。考虑它的方式是,这种文档存储并没有真正为您提供查询,它为您提供的是高效、可扩展的文档索引。您通常可以使用此方法满足大多数用例(特别是如果您将复制添加到搜索索引),但它并不是适用于所有场景的最佳数据存储(就像 RDBMS 一样)。
  • CouchDB 遇到限制的地方是关系型数据(如果你真的不能非规范化为更扁平的结构)和应用数据库级约束。一般来说,文档数据库在关系数据库过度杀伤或效率低下的情况下非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2013-09-08
相关资源
最近更新 更多