在 PouchDB 中正确使用带有 startkey 和 endkey 的 findAll
Proper use of findAll with startkey and endkey in PouchDB
我有一个 pouchdb 文档数据库,其中包含以下示例中的元素
{
"_id": "course_2_34E82B43-3F14-2FF7-9D37-81B293D2990F",
"_rev": "18-8f8f2426a12739ffb9f3bebe27d5f158",
"data": {
"name": "HACCP formation",
"isPeriodValidity": true,
"validityMonths": 2,
"minNumEmployees": 4,
"amount": 50,
"isByCompany": true,
"activities": [
"03E0E23F-58C4-3747-A441-6CF8DFE7EF75",
"CB88B914-281A-6FC2-8A5A-10322AB93B1F"
],
"services": [],
"offers": [],
"offerServices": [],
"unmanagedServices": []
}
}
{
"_id": "document_2_24A7DB52-031E-338A-941F-450CC4760E49",
"_rev": "12-3a704b186d6d1f5490756a983ccdc526",
"data": {
"name": "MMC",
"isPeriodValidity": true,
"validityMonths": 3,
"minNumEmployees": 0,
"amount": 300,
"resources": [],
"activities": [
"B52ED0EB-22F7-800A-B678-D8E36C58354E"
],
"offers": [],
"offerServices": [],
"unmanagedServices": []
}
}
{
"_id": "resource_2_6CFE5DA9-4756-0933-B11E-1E6C546F1AB4",
"_rev": "1-0e30424758084f2d1acf042ba8c5fb19",
"data": {
"path": "aa",
"description": "aa"
}
}
我可以通过查看 _id 前缀(课程、文档、资源...)来区分元素类型。
现在我想使用优化查询来获取 say 类型课程的所有元素。
一种选择是使用芒果查询,例如:
{
"selector": {
"_id": {
"$regex": "course_"
}
}
}
但根据文档 here,似乎更优化的选项是将 allDocs 函数与 "startkey" 和 "endkey" 结合使用。例如:
database.allDocs({
include_docs: true,
startkey: "course_",
endKey: "course_\uffff"
})
通过调用此函数,我希望仅获得 "course" 元素,因为它们在 _id 字段中具有 "course_"。相反,我似乎基本上获得了 db 上的所有可用文档。
我正在添加调试会话中的图像,希望它能更好地解释情况。您可以看到传递给数据库的 searchTerm 变量,以及执行调用的代码和部分结果。如您所见,只有前 4 个结果与搜索关键字匹配,而以下内容在我看来是来自数据库的随机内容。
你能解释一下为什么吗?
你的 "endkey" 属性 是 "endKey"。您必须确保不要将 "key" 大写。同样的错误我已经犯过很多次了。
我有一个 pouchdb 文档数据库,其中包含以下示例中的元素
{
"_id": "course_2_34E82B43-3F14-2FF7-9D37-81B293D2990F",
"_rev": "18-8f8f2426a12739ffb9f3bebe27d5f158",
"data": {
"name": "HACCP formation",
"isPeriodValidity": true,
"validityMonths": 2,
"minNumEmployees": 4,
"amount": 50,
"isByCompany": true,
"activities": [
"03E0E23F-58C4-3747-A441-6CF8DFE7EF75",
"CB88B914-281A-6FC2-8A5A-10322AB93B1F"
],
"services": [],
"offers": [],
"offerServices": [],
"unmanagedServices": []
}
}
{
"_id": "document_2_24A7DB52-031E-338A-941F-450CC4760E49",
"_rev": "12-3a704b186d6d1f5490756a983ccdc526",
"data": {
"name": "MMC",
"isPeriodValidity": true,
"validityMonths": 3,
"minNumEmployees": 0,
"amount": 300,
"resources": [],
"activities": [
"B52ED0EB-22F7-800A-B678-D8E36C58354E"
],
"offers": [],
"offerServices": [],
"unmanagedServices": []
}
}
{
"_id": "resource_2_6CFE5DA9-4756-0933-B11E-1E6C546F1AB4",
"_rev": "1-0e30424758084f2d1acf042ba8c5fb19",
"data": {
"path": "aa",
"description": "aa"
}
}
我可以通过查看 _id 前缀(课程、文档、资源...)来区分元素类型。 现在我想使用优化查询来获取 say 类型课程的所有元素。 一种选择是使用芒果查询,例如:
{
"selector": {
"_id": {
"$regex": "course_"
}
}
}
但根据文档 here,似乎更优化的选项是将 allDocs 函数与 "startkey" 和 "endkey" 结合使用。例如:
database.allDocs({
include_docs: true,
startkey: "course_",
endKey: "course_\uffff"
})
通过调用此函数,我希望仅获得 "course" 元素,因为它们在 _id 字段中具有 "course_"。相反,我似乎基本上获得了 db 上的所有可用文档。
我正在添加调试会话中的图像,希望它能更好地解释情况。您可以看到传递给数据库的 searchTerm 变量,以及执行调用的代码和部分结果。如您所见,只有前 4 个结果与搜索关键字匹配,而以下内容在我看来是来自数据库的随机内容。
你能解释一下为什么吗?
你的 "endkey" 属性 是 "endKey"。您必须确保不要将 "key" 大写。同样的错误我已经犯过很多次了。