對人們的看法
為了向你展示如何使用檢視,我們將假設我們要查詢型別為 people 的文件。為此,我們首先需要一個能夠儲存我們觀點的設計文件。
注意:出於示例的目的,我們將在 1 個設計文件中使用許多檢視。因此,在生產環境中,你可能希望每個設計文件具有 1 個檢視。原因是每次更新設計文件時,都會重新執行所有檢視( 至少對於 Cloudant ) 。
所以在這一點上,我假設你知道什麼是設計文件及其工作原理。我們的設計文件如下所示:
{
"_id":"_design/people",
"language":"javascript"
}
然後,在本文件的內部,你將擁有檢視屬性。此屬性包含一個包含檢視的物件。每個檢視都有自己的物件,其中包含一個 map 函式和一個 reduce 函式。如果我們有一個從資料庫中獲取所有人的檢視,它的外觀如下:
{
"_id":"_design/people",
"language":"javascript",
"views":{
"all":{
"map":"function(doc){if(doc.type ===\"people\")emit(doc._id);}"
}
}
}
這樣的檢視會返回如下內容:
{
"total_rows": 2,
"offset": 0,
"rows": [
{ "id": "people_23929319009123", "key": "people_23929319009123", "value": null },
{ "id": "people_11482871000723", "key": "people_11482871000723", "value": null }
]
}
到目前為止我們所做的是給予我們所有人的觀點。SQL 中的等價物是:SELECT * FROM table WHERE type="people"
。我將詳細解釋地圖功能的工作原理。
地圖功能:全部
function(doc) {
if (doc.type === "people") emit(doc._id);
}
首先,你需要知道將為每個文件執行 map 函式。現在對於 map 函式,你需要知道它需要一個引數: doc 。在 map 函式中,你的邏輯將確定是否需要對映 doc。如果是,你將使用 emit()
函式對其進行索引。emit 函式有 2 個引數。
- 索引的關鍵
- 要發出的值
最後,它將建立一個包含 3 列的陣列: id , key , value 。
注意:永遠不要發出 doc 作為值。這完全沒用,因為使用 include_docs 引數將獲取與 id 關聯的文件。
複雜的鍵
現在讓我們說我們想根據不同的引數獲取人員。假設我想詢問使用者的姓名,性別和子女數量。
在這種情況下,我們會有這樣的檢視:
function(doc) {
if (doc.type === "people") {
emit([doc.name,doc.gender,doc.childrenCount]);
}
}
例如,我沒有驗證物件是否具有所需引數,因為我不會給我帶來任何問題。因此,它可能會因你的具體情況而異。例如,你可能想檢查它們是否具有引數 birthDate。
所以現在,正如你所看到的,我們仍然有一把鍵,但它很複雜。這裡的訣竅是我們的鍵是一個陣列,所以我們可以有多個鍵。
現在,你可能會問自己,但是,嘿,我該如何使用它?有點奇怪! 保持冷靜,我會告訴你如何!
當你查詢多個鍵時,最好知道 CouchDB 中的比較是如何工作的。有關詳細資訊,請檢視此內容 。最重要的是要知道,如果你使用範圍並且想要查詢一個鍵上的所有元素,則需要使用 starkey=[null]&endkey=[\ufff0]
。由於 null 是最低值而\ ufff0 是最高字元,因此它將獲得它之間的所有內容。
所以,如果我想讓所有名叫 Julia 的女性,我會做以下事情:
http://localhost:5984/db/_design/people/_view/byNameGenderChildren?starkey=["Julia","Female"]&endkey=["Julia","Female",\ufff0]
基本上,我們使用鍵[Julia,Female]獲取所有行,而對於第三部分,我們在最低值(null)和最高值(\ ufff0)之間取任何東西,這意味著一切。
接下來,如果我想要帶 3 個孩子的所有男性?這很簡單:http://localhost:5984/db/_design/people/_view/byNameGenderchildren?startkey[null,"Male",3]&endkey=[\ufff0,"Male",3]