Node.js 按值对CouchDB结果排序

Node.js 按值对CouchDB结果排序,node.js,sorting,express,couchdb,couchdb-nano,Node.js,Sorting,Express,Couchdb,Couchdb Nano,我对CouchDB(以及一般的NoSQL)是全新的,我正在创建一个简单的Node.js+express+nano应用程序来体验它。这是一个简单的书籍集合,有两个字段,“标题”和“作者” 示例文档: { "_id": "1223e03eade70ae11c9a3a20790001a9", "_rev": "2-2e54b7aa874059a9180ac357c2c78e99", "title": "The Art of War", "author": "Sun Tzu" }

我对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);
  }
}
减少功能:

{
   "_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中实现一个过滤器可以很容易地切换标题(我的结果集中的键)的排序顺序。以下是用户界面:

但我完全不知道如何为作者字段这样做


我看过,这有助于海报按数字reduce值排序,我也看过使用列表也按reduce值排序的文章,但我没有看到任何方法可以在不使用reduce的情况下对字符串值进行排序。

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

我建议使用排序键作为键,发出一个空值,并使用
include\u 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\u docs=true
参数

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

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

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

您到底想做什么?您想只按作者对列表进行排序吗?我想能够按标题或作者进行排序,最好在后续单击时在升序和降序之间切换。哦!include_docs'是缺少的链接。我没有意识到我可以返回整个文档ument当只发送一个字段时。太棒了!@SchattenJager您还可以将整个文档作为值或任意值发送,例如
emit(doc.author、[doc.author、doc.title])
。但是,由于视图是在索引时编译和存储的,因此如果您只需使用
include_docs
并在视图中存储null,这在磁盘空间方面是非常昂贵的。乍一看,CouchDB的查询结构将受到限制(我的意思是,我想用SQL做的事情会非常简单),但您已经让我看到了它的灵活性。我还将尝试您使用相同视图的第二种方法。非常感谢!说实话?它仍然非常有限。它做得很好,但肯定不适合每个用例。考虑到这一点,这种文档存储并不能真正提供查询,w它为您提供的功能是高效、可扩展的文档索引。您通常可以通过它满足大多数用例(特别是如果您将复制添加到搜索索引中),但它并不是每个场景的最佳数据存储(RDBMS并非如此)。CouchDB将遇到的限制是在高度相关的数据中(如果您真的无法将其反规范化为更平坦的结构)以及应用数据库级别的约束。一般来说,文档数据库在关系数据库过度使用或效率低下的情况下非常有用。