访问CouchDB查看PouchDB中的结果

zbwhf8kr  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(260)

我一直在同时学习CouchDB和PouchDB,也许这就是为什么我很难理解PouchDB处理CouchDB视图的方式。
我已经成功地在CouchDB中创建了一个视图,并且通过HTTP(CouchDB方式)成功地查询了它。
我遇到的问题是如何使用PouchDB查询视图,PouchDB是CouchDB或类似CouchDB的数据库的前端抽象和部分时间(?)缓存库。
根据this blog post,PouchDB在2.2.0版本中引入了一种称为“持久Map/还原”的东西。但是,由于我已经习惯了在CouchDB中使用视图,我对PouchDB试图解决的问题感到困惑。
PouchDB中的持久化map/reduce仅仅是一种从前端将视图持久化到CouchDB的方法吗?如果是这样,为什么没有明显的方法来利用已经写在后端的视图?还有,为什么PouchDB不能从一开始就做到这一点--我理解视图是CouchDB索引能力的支柱。
假设我决定有一个View(或者在SQL-land中的索引)。我真的应该使用PouchDB通过前端创建它吗?这是否意味着我会遇到关于 * 何时 * 创建视图以及是否应该覆盖它们的问题?PocuhDB只是在后台使用CouchDB视图,还是他们在前端创建自己的map/reduce查询,从而当事物被重新索引时,降低了由后端更新视图的效率。
从本质上我猜我的问题是:PouchDB是以效率为代价来重新发明轮子,还是简单地拥有CouchDB的索引功能?还是其他什么东西一起?

vngu2lb8

vngu2lb81#

我把最初的答案放在了最后,但反对票表明我的答案并不明确,所以让我直接回答这些问题:
如何使用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 = new PouchDB("sample_database")
pouchdb.query("documents_by_date", {startkey:2001, endkey:2010})

这与以前完全相同,只是PouchDB示例不再指向远程CouchDB数据库(http://example...),而是指向本地PouchDB数据库(sample_database)。所有查询、索引和处理都在浏览器中进行。
PouchDB中的持久化Map/减少仅仅是一种从前端将视图持久化到CouchDB的方式吗?
不。PouchDB中的持久Map/减少允许您查询本地存储在PouchDB中的数据。它们与CouchDB无关,只是使用相同的语法。
如果是这样,为什么没有明显的方法来利用已经写在后面的视图?
事实并非如此(如上所述),但是可以将为CouchDB编写的视图用作PouchDB的视图。语法(文档上发出的函数)是相同的。在CouchDB和PouchDB中,视图是一个设计文档(“_design/documents_by_date”),带有保存视图逻辑的视图属性。只要该设计文档在您的数据库(PouchDB或CouchDB)中,您就可以查询它。
为什么PouchDB不能从一开始就做到这一点呢?我认为视图是CouchDB索引能力的支柱。
PouchDB一直能够使用视图来查询CouchDB数据库。但是,正如您所指出的,最初,PouchDB不能索引对PouchDB数据库的查询。我认为主要原因是典型的PouchDB用例。由于PouchDB数据库在浏览器中运行,它们永远不会像CouchDB所设计的那样成为大型数据库。相反,一个典型的使用案例可能是PouchDB数据库镜像(“复制”)CouchDB数据库的一个子集。2对于一个小数据库来说,缓存的好处可以忽略不计,所以这个特性没有被优先考虑。
假设我决定有一个视图(或者SQL-land中的索引),我知道我会经常使用它,我真的应该使用PouchDB通过前端创建它吗?
这里的问题是你在询问视图的创建。视图只是一个需要保存在couchdb或pouchdb数据库中的设计文档。你如何创建它并不重要(有点像应该使用哪个编辑器来编写SQL查询)。你是希望视图针对远程(couchdb)数据还是本地(pouchdb)数据运行将决定你最终将视图保存在哪里。
这是否意味着我将遇到关于何时创建视图以及是否应该覆盖它们的问题?
不确定你说的覆盖它们是什么意思。
PocuhDB只是在后台使用CouchDB视图,或者他们在前端创建自己的Map/减少查询,从而在重新索引时降低了后端更新视图的效率。
同样,这归结为理解您可以使用pouchdb查询couchdb数据库或pouchdb数据库。效率问题归结为用例,从前端和后端的Angular 考虑它并不能很好地Map到许多PouchDB用例。
PouchDB是以效率为代价来重新发明轮子,还是简单地拥有CouchDB的索引功能?还是其他什么东西一起?
这两种选择(重新发明轮子或取得所有权)都不正确。CouchDB的客户端和在浏览器中运行的JavaScript中的独立CouchDB实现。它启用了一个全新的Web应用程序类,包括Web站点脱机工作并具有完整的数据库功能的能力。
原始答案如下:
PouchDB(至少)有两个功能:

1.用javascript实现的CouchDB,这意味着你可以得到一个功能齐全的数据库,它的工作方式和CouchDB一样,只是整个数据库在浏览器中本地运行(即使你离线)。由于PouchDB能够与CouchDB进行复制,它可以作为CouchDB的本地(基于浏览器的)缓存。它也可以作为一个独立的数据库。

  1. PouchDB也是一个javascript库,允许您访问CouchDB的远程(基于云)示例。
    当您创建PouchDB示例时,您告诉它要么连接到远程CouchDB示例,要么创建一个本地示例(在浏览器中)。
remoteDB = new PouchDB("http://couchdb.example.com/remote_database")
localDB = new PouchDB("local_database")

当您执行查询时,您可以在远端执行行程或本机执行行程上执行查询,视您已建立的是哪一个执行行程而定。如果是远端数据库,则查询会查看远端数据库上的所有数据。如果是本机数据库,则查询将遍历本地数据库中的所有数据。本地查询可以像couchdb在服务器上一样使用索引--这些被称为持久查询--或者您可以执行临时查询,该查询查看数据库中的每个文档。查询远程couchdb还是本地pouchdb,使用持久查询还是临时查询,取决于许多因素,例如应用程序是否需要脱机工作、拥有多少数据、是否将整个数据库复制到本地示例等。
PouchDB不仅仅是重新发明了轮子,它还利用了CouchDB的所有优点,使它们即使在没有互联网连接的情况下也能在浏览器中工作。

相关问题