来自JavaScript的CouchDB


CouchDB可能是唯一一个使用超文本传输协议的数据库。它公开了一个类似REST的api,您可以通过JavaScript直接访问它来显示视图或更新文档。

我也有过类似的经历good experience with Solr,这基本上是Lucene通过超文本传输协议正确完成的。因此,我决定在一个与大学相关的项目中试用CouchDB,并快速构建一个基于Ajax的用户界面。

由于same origin policy,您可能会从与CouchDB相同的主机提供您的应用程序的JS和超文本标记语言文件,或者使用某种反向代理将到达您的主机的合法的超文本传输协议请求定向到CouchDB。

就我而言,我decided to build a CouchApp简单地将所有文件和文档一起存储在CouchDB中;CouchDB将同时为超文本标记语言和。js文件和包含Json数据的视图。这似乎是CouchApp的标准做法。

要从浏览器访问CouchDB,您可以直接使用XMLHttpRequest对象,或者将它隐藏在一个简单的包装器之外。包装器不会做很多工作,但是它确实简化了Api。

我使用了jQuery插件,你可以在http://localhost:5984/_ utils/script/couch . js在您的本地CouchDB安装中。这个库扩展了$带有$的全局对象。couch对象,它是调用CouchDB的入口点。

沙发应用

CouchApp是一个简单的python工具,使您能够在本地对应用程序进行编码,并将代码推送到一个CouchDB实例中。

事实上,我们之前看到的JS库在默认情况下是在CouchApps中使用的。然而,我不喜欢依靠魔法,而是通过调用$来构建我的超文本标记语言和JavaScript。沙发Api直接。因此,我修改了由couchapp生成的index.html文件,该文件已经加载了couchdb-jquery JS Api:

<script src="http://127.0.0.1:5984/databaseName/_design/couchAppName/vendor/couchapp/loader.js"></script>
当然,这个脚本反过来在其他东西之间加载,http://127 . 0 . 0 . 1:5984/_ utils/script/jquery . couch . js这是您想要使用的真正的jQuery插件。它还加载了Jquery——这对于快速构建Ajax接口非常方便。

请注意,Api没有发布,将来可能会改变。请参考您自己的jquery.couch.js文件来解决任何疑问,以防此处的信息过时。
$.couch.db()是您可以用来创建“数据库连接”的工厂方法。当然,在您进行必须与CouchDB实例通信的特定方法调用之前,不会建立任何连接。以下是如何实例化数据库对象:
var db = $.couch.db('databaseName');

方法

这些是对数据库对象调用的最重要的方法。

db.openDoc(docId、选项、ajaxOptions)

  • docId是文档的关键。这里没什么好说的了。
  • 选择是couchDb的参数(该参数是json对象。(
  • Ajax选项也是一个Json对象,但是被jQuery代替使用。例如,关键的“成功”应该指向将在完成时调用的回调。这个密钥不超过将被传递给$的内容。ajax()调用。

请记住,在JavaScript中(谢天谢地),每个输入/输出通信都是不连续的。这成功回调将以文档作为唯一参数来调用。这对于那些习惯于Ajax的用户来说是显而易见的,但对于服务器端的程序员来说却不是。

db.saveDoc(文档,选项)

  • doc是一个Json对象,它代表整个文档。CouchDB处理它没有任何问题,即使它有一个包含其他对象或数组的嵌套结构。但是要确保它是真正的Json:例如,函数不是Json标准的一部分。
  • 选择是一个Json对象。这里的关键是成功错误,这是回调。成功将像往常一样,以HTTP响应作为唯一参数来调用。

db.removeDoc(文档,选项)

  • 这里doc是文档数据的子集,至少应该包含文档。_id和文档。_rev .
  • 选择通常的对象包含回调,回调将被传递给$。直接使用ajax()。

db.view(名称,选项)

  • 姓名服务器上视图的路径:databaseName/viewName。
  • 选择是jQuery的常用对象,至少包含“成功”回调。但是,查询字符串中还会附加其他选项:例如,group_level会影响视图缩减阶段的值分组。

成功将使用具有键的对象来调用。钥匙包含各种对象,这些对象是定义视图的MapReduce操作的结果。每行都有价值字段。如果这听起来不清楚,控制台. log()将会有所帮助。

密码

使用$.couch.js,可以非常简单地将一些jQuery实用程序连接起来,将视图加载到表中:
        function loadSales()
{
$("#sales").empty();
db.view("marketing/sales", {
success: function(data) {
for (i in data.rows) {
doc = data.rows[i].value;
html = '<tr>' +
'<td>' + doc.client + '</td>' +
'<td>' + doc.amount + '</td>' +
'<td>' + doc.date_day + '/' + doc.date_month + '/' + doc.date_year + '</td>' +
'<td>' + doc.segment + '</td>' +
'</tr>';
$("#sales").append(html);
}
},
});
}
通过表单添加文档也非常简单:

$('button#add_sale').click(function(event) {
var form = $('form#sale');
var doc = {
'amount' : parseInt(form.find('#amount').val()),
'client' : form.find('#client').val(),
'date_day' : parseInt(form.find('#date_day').val()),
'date_month' : parseInt(form.find('#date_month').val()),
'date_year' : parseInt(form.find('#date_year').val()),
'segment' : form.find('#segment').val(),
'type' : 'sale'
};
db.saveDoc(
doc,
{
success : function() {
$(':input', form).not(':button').val('');
loadSales();
loadSalesByPeriod(1);
loadSalesStatistics(1);
}
}
);
return false;
});
我希望你会喜欢从JavaScript访问CouchDB。这是唯一一个专门为此构建的数据库。