3

我一直在同时学习 CouchDB 和 PouchDB,也许这就是为什么我无法理解 PouchDB 处理CouchDB Views的方式。

我已经在 CouchDB 中成功创建了一个视图,并且通过 HTTP(CouchDB 方式)查询它是成功的。

我遇到的问题是如何使用PouchDB查询视图,PouchDB是 CouchDB 或类似 CouchDB 数据库的前端抽象和兼职(?)缓存库。

根据这篇博文, PouchDB 在 2.2.0 版本中引入了一种叫做“持久映射/减少”的东西。但是由于我已经习惯了在 CouchDB 中使用 Views,我对 PouchDB 试图解决的问题感到困惑。

PouchDB 中的持久化 map/reduce 仅仅是从前端舒适地将视图持久化到 CouchDB 的一种方式吗?如果是这样,为什么没有明显的方法来利用已经写在后面的视图?而且,为什么 PouchDB 从一开始就无法做到这一点 - 我理解 Views 是 CouchDB 索引能力的支柱。

假设我决定有一个我知道我会经常使用的视图(或 SQL 领域的索引)。我真的应该使用 PouchDB 通过前端创建它吗?这是否意味着我会遇到关于何时创建视图以及是否应该覆盖它们的问题?PocuhDB 是在幕后简单地使用 CouchDB 视图,还是他们在前端创建自己的 map/reduce 查询,从而在重新索引事物时失去后端更新视图的效率。

从本质上讲,我想我的问题是:PouchDB 是以效率为代价重新发明轮子,还是仅仅拥有 CouchDB 的索引功能?还是其他什么都在一起?

4

1 回答 1

1

我将最初的答案保留在底部,但反对票表明它并不清楚,所以让我直接解决问题:

“如何使用 PouchDB 查询视图...”?

对此的答案取决于“观点”的含义。首先考虑“视图”,即 CouchDB 视图。一个 CouchDB 实例,可以有视图,可以通过 PouchDB 库查询。这是通过实例化 PouchDB 并将其指向 CouchDB 实例来完成的:

pouchdb = new PouchDB("http://example.com:5984/sample_database")

如果 couchDB 实例有一个名为“documents_by_date”的视图,那么您可以使用您的 pouchdb 实例查询它:

pouchdb.query("documents_by_date", {startkey:2001, endkey:2010})

PouchDB 将使用 couchdb HTTP 接口来查询documents_by_date 视图。搜索文档和缓存结果的所有繁重工作都由 couchdb 实例上的 couchdb 处理。在这个例子中,PouchDB 只是发送 HTTP 请求并返回 JSON 结果。

现在考虑“视图”的另一个含义。PouchDB 也可以作为一个完全独立运行在浏览器中的数据库。所有数据都存储在浏览器中。您还可以使用视图来索引这些数据,就像使用 CouchDB 一样。最初 PouchDB 没有缓存能力,所以 PouchDB 视图只是意味着在每次调用查询时迭代数据库中的每个文档以创建索引。最终添加了缓存,这意味着持久视图,这意味着在完成查询时不必遍历每个文档。那么如何查询 PouchDB 视图呢?

pouchdb = new PouchDB("sample_database")
pouchdb.query("documents_by_date", {startkey:2001, endkey:2010})

这与以前完全相同,只是 PouchDB 实例不再指向远程 CouchDB 数据库(http://example...),而是现在指向本地 PouchDB 数据库(sample_database)。所有的查询、索引和处理都只发生在浏览器中。

PouchDB 中的持久化 map/reduce 仅仅是从前端舒适地将视图持久化到 CouchDB 的一种方式吗?

不可以。PouchDB 中的持久化 map/reduce 允许您查询本地存储在 PouchDB 中的数据。除了使用相同的语法之外,它们与 CouchDB 无关。

如果是这样,为什么没有明显的方法来利用已经写在后面的视图?

并非如此(如上所述),但是可以使用为 CouchDB 编写的视图作为 PouchDB 的视图。语法(文档上发出的函数)是相同的。在 CouchDB 和 PouchDB 上,视图是一个设计文档(“_design/documents_by_date”),其视图属性包含视图逻辑。只要该设计文档在您的数据库(PouchDB 或 CouchDB)中,您就可以查询它。

PouchDB 从一开始就无法做到这一点 - 我理解 Views 是 CouchDB 索引能力的支柱。

PouchDB 一直能够使用视图来查询 CouchDB 数据库。但是,正如您所指出的,最初,PouchDB 无法将查询索引到 PouchDB 数据库。我认为主要原因是典型的 PouchDB 用例。由于 PouchDB 数据库在浏览器中运行,它们永远不会像 CouchDB 设计的那样是海量数据库。相反,一个典型的用例可能是 PouchDB 数据库镜像(“复制”)CouchDB 数据库的一个子集。对于小型数据库,缓存的好处可以忽略不计,因此没有优先考虑此功能。

假设我决定有一个我知道我会经常使用的视图(或 SQL 领域的索引)。我真的应该使用 PouchDB 通过前端创建它吗?

这里的问题是您正在询问视图创建。视图只是一个设计文档,需要保存在 couchdb 或 pouchdb 数据库中。如何创建它并不重要(有点像应该使用哪个编辑器来编写 SQL 查询)。您是否希望该视图针对远程 (couchdb) 数据或本地 (pouchdb) 数据运行将决定最终保存该视图的位置。

这是否意味着我会遇到关于何时创建视图以及是否应该覆盖它们的问题?

不知道覆盖它们是什么意思。

PocuhDB 只是在幕后使用 CouchDB 视图,或者他们是否在前端创建自己的 map/reduce 查询,从而失去了在重新索引事物时由后端更新视图的效率。

同样,这归结为您可以使用 pouchdb 查询 couchdb 数据库或 pouchdb 数据库。效率问题归结为用例,从前端与后端的角度考虑它并不能很好地映射到许多 PouchDB 用例。

PouchDB 是以效率为代价重新发明轮子,还是仅仅拥有 CouchDB 的索引功能?还是其他什么都在一起?

这些选项(重新发明轮子或取得所有权)都不正确。PouchDB 至少包含两件事:CouchDB 的客户端和在浏览器中运行的 javascript 中的独立 CouchDB 实现。它支持全新类别的 Web 应用程序,包括使网站能够以完整的数据库功能离线工作。

原答案如下:

PouchDB 是(至少)两件事:

  1. CouchDB 在 javascript 中的实现,这意味着您将获得一个功能齐全的数据库,它与 CouchDB 一样工作,除了整个东西在浏览器中本地运行(即使您处于离线状态)。由于 PouchDB 能够与 CouchDB 进行复制,因此它可以充当 CouchDB 的本地(基于浏览器)缓存。它也可以作为一个独立的数据库。

  2. PouchDB 也是一个 javascript 库,可让您访问 CouchDB 的远程(基于云)实例。

当你创建一个 PouchDB 实例时,你告诉它要么连接到远程 CouchDB 实例,要么创建一个本地实例(在浏览器中)。

remoteDB = new PouchDB("http://couchdb.example.com/remote_database")
localDB = new PouchDB("local_database")

当您执行查询时,您可以在远程实例或本地实例上运行该查询,具体取决于您已实例化上述哪一项。如果它是远程数据库,则查询会查看远程数据库上的所有数据。如果是本地数据库,则查询会查看本地数据库中的所有数据。本地查询可以使用与服务器上的 couchdb 完全相同的索引——这些被称为持久查询——或者你可以做一个临时查询来查看数据库中的每个文档。无论您是查询远程 couchdb 还是本地 pouchdb,以及您使用的是持久查询还是临时查询,都取决于很多因素,例如您的应用程序是否需要离线工作、您拥有多少数据、是否复制整个数据库到您的本地实例等。

PouchDB 不仅重新发明了轮子。它充分利用了 CouchDB 的所有优点,即使在没有互联网连接的情况下也可以在浏览器中工作。

于 2018-01-09T07:49:28.300 回答