我是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的字符串值上执行此操作。
答案 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);
...然后使用复合键进行查询。