【问题标题】:PouchDB view lookup by keyPouchDB 按键查找视图
【发布时间】:2017-03-07 10:37:01
【问题描述】:

我有一个名为 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 -> a、ab、abc、bc)作为 keydoc ._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 中查找文档的方法是什么,而不会在每次我想找到 ab 键时触发整个 map/reduce 过程?正如我所提到的,我可以使用 http 请求查询 CouchDB _design/t-cust-design/_view/by-custdes 视图,它运行速度很快,但我无法使用 PouchDB API 执行等效操作。

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

【问题讨论】:

  • 当你创建 t-customers.query() 时,这是本地 PouchDB 实例还是指向 CouchDB 的 PouchDB?
  • 我认为这是一个本地 PouchDB 实例。我正在使用 PouchDB API 来触发 query() 函数。我假设该函数将在本地 PouchDB 数据库上执行,该数据库链接到其 CouchDB 数据库“双胞胎”。
  • 我的意思是,您是在本地创建数据库new PouchDB("dbName") 还是远程创建数据库new PouchDB("remote ip")

标签: apache mapreduce couchdb pouchdb nosql


【解决方案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 实例构建。原因之一是您可以进行过滤复制,因此每个实例可能有自己的“世界”视图,也就是数据库内容。

我从您的 cmets 中假设您使用 PouchDB 将数据库复制到浏览器中,然后在本地调用视图,因此从技术上讲,您使用的是数据库的两个实例,如果您首先创建离线数据库,这完全有意义应用程序。但是如果您希望 CouchDB 实例始终可用,只需查询 CouchDB 服务器,这样就不必在每个用户的浏览器中重新构建视图。

【讨论】:

  • 另一个不同步索引本身的原因,即使它们有相同的数据,是磁盘上的格式完全不同,所以 Couch 的索引无论如何对 Pouch 没有任何用处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多