我有一个名为t-customers
的CouchDB数据库。使用Fauxton我创建了以下视图t-customers/_design/t-cust-design/_view/by-custdes
。这是地图功能:
function (doc) {
var custname = doc.CUSTNAME;
if(custname != undefined && custname.length != undefined && custname.length != ''){
for(var i = 0; i < custname.length - 1; i++)
for(var j = i + 1; j < custname.length + 1; j++)
emit(custname.substring(i, j),doc._id);
}
}
该视图将包含 custdes 的所有可用子字符串(例如custdes = abc - &gt; a,ab,abc,bc)为键和 doc._id 作为值。
创建视图后,我可以使用以下http请求进行查询:
http://127:0.0.1:5984/t-customers/_design/t-cust-design/_view/by-custdes?key="ab"
http://127:0.0.1:5984/t-customers/_design/t-cust-design/_view/by-custdes?key="abc"
它的工作速度与闪电一样快,但我的观点是 1.500.000 文件已编入索引。
首先:我注意到PouchBD只同步t-customers数据库,而不是它的视图。为什么?要在PouchDB中使视图可用,我需要运行以下命令,最多需要20分钟才能完成:
t-customers.query("t-cust-design/by-custdes").then(...).catch(...);
只有这样我才能在Chrome中看到IndexedDB的视图。
其次:在PouchDB视图t-cust-design/by-custdes
中查找文档的方式是什么,而不是每次我想要找到{{1}时都触发整个map / reduce进程钥匙?正如我所提到的,我可以使用http请求查询CouchDB ab
视图,但它运行速度很快,但我无法使用PouchDB API执行等效操作。
我已经阅读了大量的文档,但我仍然对此感到困惑......
答案 0 :(得分:1)
首先回答你的第二个问题(好吧,有点):
为避免生成所有可能的字符组合(导致1.500.000视图结果),仅发出整个单词并查询以查询字符串开头的键。您可以使用startkey
和endkey
参数。
function(doc) {
var custname = doc.CUSTNAME || '';
for(var i = 0; i < custname.length - 1; i++) {
emit(custname.substring(i)); // You don't need to emit the _id - it's available on each view row automatically.
}
}
使用参数{startkey:'ab', endkey:'ab\ufff0'}
查询视图。
有关详细信息,请参阅CouchDB docs。
关于您的第一个问题: 始终根据CouchDB和PouchDB实例构建视图。其中一个原因是您可以进行过滤复制,因此每个实例可能都有自己的&#34; world&#34; a.k.a.数据库内容。
我从您的评论中假设您使用PouchDB将数据库复制到浏览器中,然后在本地调用视图,因此从技术上讲,您使用的是数据库的两个实例,如果您正在创建离线,这将完全有意义 - 第一个应用程序。但是如果您希望CouchDB实例始终可用,只需查询CouchDB服务器,这样就不必在每个用户的浏览器中重建视图。