按键

时间:2017-03-07 10:37:02

标签: apache mapreduce couchdb pouchdb nosql

我有一个名为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执行等效操作。

我已经阅读了大量的文档,但我仍然对此感到困惑......

1 个答案:

答案 0 :(得分:1)

首先回答你的第二个问题(好吧,有点):

为避免生成所有可能的字符组合(导致1.500.000视图结果),仅发出整个单词并查询以查询字符串开头的键。您可以使用startkeyendkey参数。

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服务器,这样就不必在每个用户的浏览器中重建视图。