對人們的看法

為了向你展示如何使用檢視,我們將假設我們要查詢型別為 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 個引數。

  1. 索引的關鍵
  2. 要發出的值

最後,它將建立一個包含 3 列的陣列: idkeyvalue

注意:永遠不要發出 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]