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接口非常方便。
var db = $.couch.db('databaseName');
这些是对数据库对象调用的最重要的方法。
db.openDoc(docId、选项、ajaxOptions)
请记住,在JavaScript中(谢天谢地),每个输入/输出通信都是不连续的。这成功回调将以文档作为唯一参数来调用。这对于那些习惯于Ajax的用户来说是显而易见的,但对于服务器端的程序员来说却不是。
db.saveDoc(文档,选项)
db.removeDoc(文档,选项)
db.view(名称,选项)
成功将使用具有键的对象来调用行。钥匙行包含各种对象,这些对象是定义视图的MapReduce操作的结果。每行都有键和价值字段。如果这听起来不清楚,控制台. log()将会有所帮助。
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) {我希望你会喜欢从JavaScript访问CouchDB。这是唯一一个专门为此构建的数据库。
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;
});