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,因为它提供了一种快速查看索引的方法。
在我的数据库中,我有(不仅)两种一对多关系的文档。我尝试像下面的示例所示那样管理它:
{
_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,因为它提供了一种快速查看索引的方法。