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