CouchDB数据查询、验证功能全解析
立即解锁
发布时间: 2025-08-20 02:20:03 阅读量: 1 订阅数: 2 


CouchDB权威指南:从入门到实践
# CouchDB数据查询、验证功能全解析
## 1. 数据查询基础
在数据查询方面,我们可以通过特定的URL来获取单个文档。例如,要获取 “Biking” 博客文章,可以使用 `/blog/_design/docs/_view/by_date?key="2009/01/30 18:04:11"`。这里的 `key` 参数可以根据需求进行设置,无论设置什么值,都能实现精确且快速的查找。
当存在多个行具有相同的键时(比如设计一个视图,键为文章作者的姓名),键查询可能会返回多行结果。
### 1.1 查询多个文档
如果要获取上个月的所有文章,以当前是二月为例,可以使用 `/blog/_design/docs/_view/by_date?startkey="2010/01/01 00:00:00"&endkey="2010/02/00 00:00:00"`。`startkey` 和 `endkey` 参数指定了一个包含性的范围,用于搜索。
为了使操作更便捷并为后续示例做准备,我们将日期字段的格式从字符串改为数组,数组的每个成员按时间戳的重要性递减排列。示例如下:
```javascript
// 原格式
{
"date": "2009/01/31 00:00:00"
}
// 新格式
"date": [2009, 1, 31, 0, 0, 0]
```
这种格式的改变不会影响 `map` 函数,但视图结果会有所不同,如下表所示:
| Key | Value |
| --- | --- |
| [2009, 1, 15, 15, 52, 20] | "Hello World" |
| [2009, 2, 17, 21, 13, 39] | "Biking" |
| [2009, 1, 30, 18, 4, 11] | "Bought a Cat" |
查询语句也相应改变为 `/blog/_design/docs/_view/by_date?key=[2009, 1, 1, 0, 0, 0]` 和 `/blog/_design/docs/_view/by_date?key=[2009, 01, 31, 0, 0, 0]`。这只是语法上的变化,不影响其含义,同时也展示了视图的强大功能。我们不仅可以使用字符串和整数等标量值构建索引,还可以使用 JSON 结构作为视图的键。
### 1.2 标签查询示例
假设我们为文档添加了标签列表,并希望查看所有标签,但不关心未标记的文档。示例代码如下:
```javascript
{
...
tags: ["cool", "freak", "plankton"],
...
}
{
...
tags: [],
...
}
function(doc) {
if(doc.tags.length > 0) {
for(var idx in doc.tags) {
emit(doc.tags[idx], null);
}
}
}
```
这个示例展示了一些新特性:可以对结构进行条件判断(`if(doc.tags.length > 0)`),而不仅仅是对值进行判断;`map` 函数可以为每个文档多次调用 `emit()` 函数;可以将 `null` 作为值传递给 `emit()` 函数的第二个参数,键参数也可以传递 `null`。
### 1.3 获取反向结果
要以反向顺序检索视图结果,可以使用 `descending=true` 查询参数。但如果同时使用 `startkey` 参数,可能会得到不同的结果甚至没有结果。这是因为视图查询选项的工作原理如下:
1. 从顶部开始读取,如果存在 `startkey` 参数,则从该参数指定的位置开始。
2. 逐行返回结果,直到视图结束或遇到 `endkey`(如果存在)。
当指定 `descending=true` 时,读取方向会反转,但视图中行的排序顺序不变。以下是一个示例:
假设视图结果如下:
| Key | Value |
| --- | --- |
| 0 | "foo" |
| 1 | "bar" |
| 2 | "baz" |
如果查询选项为 `?startkey=1&descending=true`,CouchDB 会跳转到键为 1 的行,然后向后读取直到视图结束,结果为:
| Key | Value |
| --- | --- |
| 1 | "bar" |
| 0 | "foo" |
这可能不是我们想要的结果。要以反向顺序获取索引为 1 和 2 的行,需要将 `startkey` 改为 `endkey`,即 `endkey=1&descending=true`,结果如下:
| Key | Value |
| --- | --- |
| 2 | "baz" |
| 1 | "bar" |
### 1.4 获取文章评论视图
我们使用数组键来支持 `group_level` 归约查询参数。CouchDB 的视图存储在 B - 树文件结构中,由于 B - 树的结构特点,我们可以在树的非叶子节点中缓存中间归约结果,从而使归约查询能够在对数时间内计算任意键范围的结果。
在博客应用中,我们使用 `group_level` 归约查询来计算每篇文章和总体的评论数量。假设每个键的值为 1,有以下数组键:
```javascript
["a","b","c"]
["a","b","e"]
["a","c","m"]
["b","a","c"]
["b","a","g"]
```
归约视图函数如下:
```javascript
function(keys, values, rereduce) {
return sum(values)
}
```
该函数返回起始键和结束键之间的总行数。例如,使用 `startkey=["a","b"]&endkey=["b"]`(包含上述前三个键),结果为 3。如果想在不依赖行值的情况下计算行数,可以切换
0
0
复制全文
相关推荐










