CouchDB 使用 .....
为了使用 JavaScript 来访问 CouchDB 提供的 REST 形式的 API,我们使用 Rhino 引擎, 实现了一个简单的 xmlhttprequest 来与 CouchDB 的服务器进行通信,当然使用其他语言如 C/Python 等也可以做到,此处我们使用 JavaScript 本身。 另一个常用的工具是 curl,curl 是基于命令行的,功能非常强大,支持多种网络协议。 CouchDB 的官方示例中,很多次的用到了 curl,但是我们只是在简单的测试时才会使用它。 这个小节中,我们主要讨论如何通过 HTTP 请求完成下列动作:
- 创建数据库
- 创建文档
- 创建设计文档
- 过滤数据
创建数据库非常容易,仅需要发送 PUT 请求到下列形式的 URL 即可: http://localhost:5984/database_name 即可创建一个数据库,名称为 database_name,后续的操作即以此作为基准。 创建文档时,需要指定数据库,然后将文档(JSON 字符串)通过 HTTP 的 POST 方式发送到下列形式的 URL 上: http://localhost:5984/database_name 需要发送的文档的形式如下:
{
"name" : "Juntao",
"language" : ["Chinese", "English"]
}
请求成功之后,服务器会为此文档创建 id 及版本信息。可以通过 GET 下列形式的 URL 来 获取文档: http://localhost:5984/contacts/46efa16cc220f6548696a6e6fc004463
此处的 46efa16cc220f6548696a6e6fc004463 即为 CouchDB 为此文档生成的 GUID,结果如下:
{
"_id": "46efa16cc220f6548696a6e6fc004463",
"_rev": "1-37802625d560be4af0dc18155422fd2b",
"language": [
"Chinese",
"English"
],
"name": "Juntao"
}
设计文档是一种特别的文档,用以表现应用程序的逻辑部分,其中包含视图(map/reduce 对),附件定义等。CouchDB 是基于文档的,因此将应用程序作为文档也就不足为奇了。 下面是一个设计文档的示例:
{
"_id": "_design/filters",
"_rev": "2-85428a15c29f7dc5b31be1a0a3a217c9",
"views": {
"view_gt": {
"map": "function(doc){...}",
"reduce" : "function(keys, values, rereduce){}"
},
"view_lt": {
"map": "function(doc){...}",
"reduce" : "function(keys, values, rereduce){}"
},
"view_company": {
"map": "function(doc){...}",
"reduce" : "function(keys, values, rereduce){}"
}
},
"shows" : {
"show_sth" : "function(doc, req){}"
},
"_attachments" : {
}
}
其中,views 中包含 map/reduce 的定义,用以对数据进行抽取,转换。_attachments 中包含文档的附件的定义。设计文档的路径均以”/database_name/_design”开头。我们这里着重讨论设计文档的 views 节:
每个 view 中包含一个 map 函数和一个可选的 reduce 函数。map 负责在所有的文档中收集信息,并生成 key/value 对,这个动作是并行的,可能同时有多个 map 函数在工作。所有的 map 函数都是用同一种 hash 算法,从而使得具有相同 hash 值的结果会被存储到 一起。而 reduce 则负责将相同 hash 值的结果进行处理,并最终产生结果。map 函数相 当于关系数据库中聚合查询的 group-by 子句,而 reduce 函数则相当于聚合函数,如统计,求平均值等。
比如,我们可以将 gt10 这个 view 的 map/reduce 定义如下:
function(doc){
if(doc.name && doc.age){
if(doc.age > 10){
emit(doc.name, doc.age);
}
}
}
function(keys, values, rereduce){
return sum(values);
}
这个 map 将产生 key 为联系人名字,value 为联系人年龄的 key/value 对,而 reduce 将符合 map 的所有联系人的年龄加在一起。
{$ activeFileHint $}