按值对 CouchDB 结果进行排序

Sorting CouchDB result by value

我是 CouchDB(和一般的 NoSQL)的新手,我正在创建一个简单的 Node.js + express + nano 应用程序来感受它。这是一本简单的 collection 书籍,有两个字段,'title' 和 '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 中实现过滤器以切换标题的排序顺序,这是我结果中的关键放。这是 UI:

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

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

我看到 this question, which helped a poster sort by a numeric reduce value, and I've read a blog post 使用列表也可以按归约值排序,但我还没有看到在没有归约值的情况下对字符串值执行此操作的任何方法。

如果你想按特定的 属性 排序,你需要确保 属性 是键(或者,在数组键的情况下,是数组中的第一个元素).

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

您的地图函数将像下面这样简单。

按作者排序:

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);

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