面向文档的数据库 CouchDB(6)

来源:developerWorks 中国 作者:成 富
  

从代码清单 20 中可以看到如何根据 head 和 row 的值来判断当前的迭代状态。首先 head 不为空,这是迭代之前的状态,应该输出整个 HTML 文档的头部;接着row不为空,这是对视图运行结果的每行进行迭代,应该输出代表每行结果的 HTML 片断,如代码清单 21 所示;最后是迭代之后,应该输出整个 HTML 文档的尾部。所有这些调用的结果会被组合起来,形成一个完整的 HTML 文档,返回给客户端。


清单 21. 显示每行记录的 HTML 片断
<table width="100%" class="book"> 
   <tbody> 
      <tr> 
         <td width="100px" valign="top"></td> 
         <td valign="top"> 
            <div class="title"> 
              <a href="<%= link %>"><%= title %></a> 
            </div> 
            <p><%= author %> / <%= publish_date %> / <%= press %> / <%= price %></p> 
         </td> 
      </tr> 
   </tbody> 
 </table>

在 list 方法输出的 HTML 文档中,同样可以添加 JavaScript 代码使用 CouchDB jQuery 插件来进行数据库操作,其做法类似于 show 方法。

至此,关于使用 CouchDB 开发 Web 应用的主要方面已经介绍完毕。下面介绍一些高级话题。





高级话题

权限控制与安全

CouchDB 目前只支持一种角色,即“系统管理员”。“系统管理员”可以执行任意的 HTTP REST API 对数据库进行任意的修改。可以在 CouchDB 的配置文件中添加系统管理员的帐号和密码。 CouchDB 也自带对 HTTP 基本认证的支持,同样可以在配置文件中启用这一认证方式。

由于目前 CouchDB 对于权限控制功能比较弱,一种比较好的做法是用 Apache HTTP 服务器作为 CouchDB 的反向代理,由 Apache HTTP 服务器来处理访问控制。关于配置 Apache HTTP 服务器,见参考资料。

文档更新校验

CouchDB 允许文档在创建和更新之前先进行校验。只有校验通过的文档才能被保存在数据库中。校验方法是由设计文档中的validate_doc_update字段来表示的。所有的文档更新都会调用该方法,如果该方法抛出异常,则说明校验失败,CouchDB 会返回异常中的错误信息给客户端。

validate_doc_update的示例如代码清单 22 所示。该方法可以接受 3 个参数:newDoc、oldDoc 和 userCtx,其中 newDoc 表示待创建或更新的文档对象,oldDoc表示数据库中已有的文档对象,userCtx 则是一个包含 db、name 和 roles 三个属性的 JSON 对象,分别表示数据库名称、用户名和用户所属角色的数组。


清单 22.validate_doc_update方法示例
function(newDoc, oldDoc, userCtx) { 
  if(newDoc.type == "book") { 
    if(newDoc.title === undefined) { 
      throw {required_field_is_missing : "Book must have a title."}; 
    } 
    else if (newDoc.author === undefined) { 
      throw {required_field_is_missing : "Book must have an author."}; 
    } 
  } 
 }

在代码清单 22中,validate_doc_update方法限定了图书必须包含标题和作者。

分组

在前面提到过,可以通过group参数在进行 Reduce 的时候对键进行分组。默认情况下,该参数的值为false,Reduce 方法会将结果变成一条记录。如果指定了group参数的值为true,则 Map 方法输出的所有记录中,键相同的记录将被分在一个组中。 Reduce 方法会把每个组都变成一条记录,也就是说得到一个单一的值做为结果。

还可以通过 group_level 参数来对分组的级别进行更细的限定。代码清单 23 中给出了 Map 方法输出的一些键。


清单 23. Map 方法输出的键
["Alex", "2009.08", 3] 
 ["Alex", "2009.08", 4] 
 ["Bob", "2009.02", 10] 
 ["John", "2009.01", 8] 
 ["Bob", "2009.03", 5]

在代码清单 23 中,Map 方法输出的键是一个数组,其中三个元素分别表示用户名、购买时间和购买数量。如果指定 group_level=1 的话,则会根据键的第一个元素进行分组,也就是说结果中包含三条记录。如果指定 group_level=2 的话,则会根据键的前两个元素进行分组,也就是说前两个元素相同的键作为一组,结果中应该包含四条记录。

键的排序

在运行视图的时候,CouchDB 总是会对键进行排序。 CouchDB 允许使用任意复杂的 JSON 对象来作为键,而键的排序顺序与键的数据类型有关。下面根据键的类型,给出了基本的排序顺序。

  • 特殊类型:null、false 和 true。
  • 数字:按照数字大小排序。
  • 字符串:按照字典顺序。长字符串在短字符串之后,大写字母在小写字母之后。
  • 数组:按照长度和对应元素排序。
  • JSON 对象:按照属性的名称和值排序。
将这个排序规则与 startkey 和 endkey两个参数结合,可以非常灵活的限定视图运行结果中所包含的键的范围。比如键的类型是表示标签的字符串,想查找所有以“ web ”开头的标签,就可以使用 startkey="web" 和 endkey="web\u9999" 来限定。(责任编辑:A6)
时间:2009-08-07 09:10 来源:developerWorks 中国 作者:成 富 原文链接

好文,顶一下
(3)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量