【问题标题】:CouchDB/PouchDB design documents query with startkey endkey not workingCouchDB/PouchDB 设计文档查询与 startkey endkey 不起作用
【发布时间】:2021-12-10 22:50:23
【问题描述】:

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

{ 
  _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"

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

为了提高性能,我想引入一个设计文档来仅查询 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"

我没有得到任何结果(只有一个空数组/没有行)。

我的错误在哪里或我的概念有什么问题?我真的不知道吗?提前感谢您的建议。

【问题讨论】:

  • 该 URL 在某些方面不好,即它需要一些 percent encoding,例如: 已保留。也摆脱双引号。修复 URL,您应该会得到结果。
  • 感谢您的回复,但将 : 更改为 %3A 和 " 更改为 %22 并不会改变任何事情。
  • 是的,你是对的

标签: couchdb pouchdb


【解决方案1】:

首先,对于视图 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)。

修复设计文档映射功能(包括不发出doc作为值)

{
  "_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,因为它提供了一种快速查看索引的方法。

【讨论】:

  • 非常感谢!你帮了我很多。现在我更了解它并理解设计文档的概念。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多