按值对CouchDB结果进行排序

时间:2015-10-26 18:39:27

标签: 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"
}

减少功能

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

由于CouchDB按键排序并支持'descending = true'查询参数,因此很容易在UI中实现过滤器以切换标题上的排序顺序,这是我的结果集中的关键。这是UI:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

我建议使用排序键作为键,发出空值并使用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);

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