对人们的看法

为了向你展示如何使用视图,我们将假设我们要查询类型为 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]