1

我是 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 中实现一个过滤器来切换标题的排序顺序,这是我的结果集中的键。这是用户界面:

带有按升序或降序排列标题的链接的书籍列表

但是我完全不知道如何为作者领域做到这一点。

我看过这个问题,它帮助海报按数字减少值排序,我读过一篇博客文章,它使用列表也按减少值排序,但我没有看到任何方法可以做到这一点没有减少的字符串值。

4

1 回答 1

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

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

于 2015-10-27T10:32:59.300 回答