簡體   English   中英

在 PouchDB 中訪問 CouchDB 查看結果

[英]Accessing CouchDB View results in PouchDB

我一直在同時學習 CouchDB 和 PouchDB,也許這就是為什么我無法理解 PouchDB 處理CouchDB Views 的方式

我已經在 CouchDB 中成功創建了一個視圖,並且通過 HTTP(CouchDB 方式)查詢它是成功的。

我遇到的問題是如何使用PouchDB查詢視圖,這是一個前端抽象和兼職(?)緩存庫,用於 CouchDB 或類似 CouchDB 的數據庫。

根據這篇博客文章, PouchDB 在 2.2.0 版中引入了一種叫做“持久映射/減少”的東西。 但是由於我已經習慣在 CouchDB 中使用視圖,所以我對 PouchDB 試圖解決的問題感到困惑。

PouchDB 中的持久映射/減少僅僅是一種從前端舒適的角度將視圖持久化到 CouchDB 的方法嗎? 如果是這樣,為什么沒有明顯的方法來利用已經寫在后面的視圖? 而且,為什么 PouchDB 從一開始就不能做到這一點 - 我理解 Views 是 CouchDB 索引能力的支柱。

假設我決定有一個我知道我會經常使用的視圖(或 SQL 領域中的索引)。 我真的應該使用 PouchDB 通過前端創建它嗎? 這是否意味着我會遇到關於何時創建視圖以及是否應該覆蓋它們的問題? PocuhDB 是簡單地在幕后使用 CouchDB 視圖,還是他們在前端創建自己的 map/reduce 查詢,從而在重新索引事物時失去后端更新視圖的效率。

從本質上講,我想我的問題是:PouchDB 是以效率為代價重新發明輪子,還是僅僅擁有 CouchDB 的索引功能? 或者其他的東西一起?

我在底部保留了我的原始答案,但是downvotes 表明它不清楚,所以讓我直接解決問題:

“如何使用 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 中的持久映射/減少僅僅是一種從前端舒適的角度將視圖持久化到 CouchDB 的方法嗎?

不可以。PouchDB 中的持久映射/減少允許您查詢本地存儲在 PouchDB 中的數據。 除了使用相同的語法之外,它們與 CouchDB 沒有任何關系。

如果是這樣,為什么沒有明顯的方法來利用已經寫在后面的視圖?

事實並非如此(如上所述),但是可以將為 CouchDB 編寫的視圖用作 PouchDB 的視圖。 語法(發出文檔的函數)是相同的。 在 CouchDB 和 PouchDB 上,視圖是一個設計文檔(“_design/documents_by_date”),帶有一個包含視圖邏輯的 views 屬性。 只要該設計文檔在您的數據庫(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 數據庫。 效率問題歸結為用例,從前端 vs 后端的角度考慮它並不能很好地映射到許多 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 的所有優點,即使沒有互聯網連接,它們也可以在瀏覽器中工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM