CouchDB/PouchDB 使用 startkey endkey 的设计文档查询不起作用

CouchDB/PouchDB design documents query with startkey endkey not working

在我的数据库中,我有(不仅)两种一对多关系的文档。我尝试像下面的示例所示那样管理它:

{ 
  _id : "class:xyz"
  type: "class"
  ... other keys ...
}

{
  _id : "class:xyz:pupil:abc"
  type: "pupil"
  ... other keys ...
}

如果我使用 allDocs() 查询我的文档,比如

http://url_of_my_server:5984/my_database/_all_docs?include_docs=true&?startkey="class:xyz:pupil:"&endkey="class:xyz:pupil:\ufff0"

我得到了所有 pupil 类型的文档,这些文档与提到的 class 类型的文档相关,就像想要的那样。

为了性能,我想引入一个设计文档来只查询类型 pupil 的文档,而不是每次都查询所有文档:

{
  "_id": "_design/types",
  "language": "javascript",
  "views": {
    "classes": {
      "map": "function(doc){ if(doc.type == \"class\"){emit(doc.id, doc);} }"
    },
    "pupils": {
      "map": "function(doc){ if(doc.type == \"pupil\"){emit(doc.id, doc);} }"
    },
  }
}

但是如果我用这样的设计文档查询

http://url_of_my_server:5984/my_database/_design/types/_view/pupils?include_docs=true&?startkey="class:xyz:pupil:"&endkey="class:xyz:pupil:\ufff0"

我没有得到任何结果(只有一个空的 array/no 行)。

我的错误在哪里或者我的构想有什么问题?我真的不知道?预先感谢您的建议。

首先,对于一个视图 never emit 文档作为一个值;它非常多余,因为人们可能会使用 include_docs=true - 更糟糕的是,它会不必要地消耗存储空间。

假设有两个文档

{
  _id : "class:xyz:pupil:abc"
  type: "pupil"  
},
{
  _id : "class:xyz:pupil:xyz"
  type: "pupil"  
}

以及 pupils

的映射函数
"pupils": {
  "map": "function(doc){ if(doc.type == \"pupil\"){emit(doc.id, doc);} }"
}

pupils 的视图索引如下所示

id key value
class:xyz:pupil:abc null {"_id": "class:xyz:pupil:abc", /* etc */ }
class:xyz:pupil:xyz null {"_id": "class:xyz:pupil:xyz", /* etc */ }

所以 key 列是 null 因为映射函数发出 doc.id 作为键。

看到了吗? doc.id 未定义 - emit(doc._id) 代替。

修复设计文档映射函数(包括不将文档作为值发出)

{
  "_id": "_design/types",   
  "views": {
    "classes": {
      "map": "function(doc){ if(doc.type == \"class\"){emit(doc._id);} }"
    },
    "pupils": {
      "map": "function(doc){ if(doc.type == \"pupil\"){emit(doc._id);} }"
    }
  }
}

给定两个假设文档,pupils 索引现在看起来像这样

id key value
class:xyz:pupil:abc class:xyz:pupil:abc null
class:xyz:pupil:xyz class:xyz:pupil:abc null

现在视图索引的 key 有一个值,查询将按预期运行。

我强烈推荐使用 Fauxton,因为它提供了一种快速查看索引的方法。