pouchdb具有异步API,支持回调,承诺,和异步函数。对于初学者,我们建议的承诺,虽然你可以自由使用任何你喜欢的格式。如果您不确定,检查我们的异步代码指南。
大部分的接口被定义为:
db.doSomething(args..., [options], [callback])
……其中的选项和回调都是可选的。
大部分的API定义:回调使用标准的Node.js语法:
function(error, result) { /* ... */ }
如果没有错误,err就是undefined。
如果不指定回调,那么API返回一个promise。 在支持的浏览器或Node.js中,使用本机promise,根据需要回退到最小库。
new PouchDB([name], [options])
此方法创建数据库或打开现有数据库。 如果您使用类似“http://domain.com/dbname”的URL,那么PouchDB将作为客户端在线的CouchDB实例。 否则它将使用任何后端存在创建本地数据库。
name:您可以省略name参数,并通过选项指定它。 请注意,名称是必需的。
var db = new PouchDB('dbname');
// or
var db = new PouchDB('http://localhost:5984/dbname');
创建一个明确使用WebSQL的PouchDB:
var db = new PouchDB('dbname', {adapter : 'websql'});
创建内存小包(必须首先安装pouchdb适配器内存):
var db = new PouchDB('dbname', {adapter: 'memory'});
db.destroy([options], [callback])
删除数据库。 请注意,这对其他复制的数据库没有影响。
db.destroy().then(function (response) {
// success
}).catch(function (err) {
console.log(err);
});
//response
{
"ok" : true
}
db.put(doc, [options], [callback])
创建新文档或更新现有文档。 如果文档已存在,则必须指定其修订版本_rev,否则将发生冲突。
对文档的有效属性名称有一些限制。 如果尝试存储非JSON数据(例如Date对象),您可能会看到不一致的结果。
示例用法:
db.put({
_id: 'mydoc',
title: 'Heroes'
}).then(function (response) {
// handle response
}).catch(function (err) {
console.log(err);
});
db.get('mydoc').then(function(doc) {
return db.put({
_id: 'mydoc',
_rev: doc._rev,
title: "Let's Dance"
});
}).then(function(response) {
// handle response
}).catch(function (err) {
console.log(err);
});
Example Response:
{
"ok": true,
"id": "mydoc",
"rev": "1-A6157A5EA545C99B00FF904EEF05FD9F" }
响应包含文档的id,新的rev和一个确定,以确保一切都没关系。
db.post(doc, [options], [callback])
创建一个新文档并让PouchDB为其自动生成一个_id。
实例用法:
db.post({
title: 'Ziggy Stardust'
}).then(function (response) {
// handle response
}).catch(function (err) {
console.log(err);
});
//response
{
"ok" : true,
"id" : "8A2C3761-FFD5-4770-9B8C-38C33CED300A",
"rev" : "1-d3a8e0e5aa7c8fff0c376dac2d8a4007"
}
注意:Put vs. post:基本的经验法则是:put()新文档带有一个_id,post()没有_id的新文档。
你应该更喜欢put()post(),因为当你post(),你缺少一个机会使用allDocs()来通过_id排序文档(因为你的_ids是随机的)。 有关更多信息,请阅读PouchDB专业提示。
检索由docId指定的文档。
db.get(docId, [options], [callback])
所有选项默认为false,除非另有说明。
options.ajax.cache:将随机字符串附加到所有HTTP GET请求的结尾,以避免它们在IE上缓存。
将此设置为true可防止发生这种情况。
实例用法:
db.get('mydoc').then(function (doc) {
// handle doc
}).catch(function (err) {
console.log(err);
});
//response
{
"_id": "mydoc",
"_rev": "1-A6157A5EA545C99B00FF904EEF05FD9F"
"title": "Rock and Roll Heart",
}
响应包含存储在数据库中的文档及其_id和_rev。
db.remove(doc, [options], [callback])
//或者
db.remove(docId, docRev, [options], [callback])
删除文档。 doc必须是至少具有_id和_rev属性的文档。 发送完整的文档也会奏效。
请参阅过滤复制,了解为什么您可能希望使用put()与{_deleted:true}。
实例用法:
db.get('mydoc').then(function(doc) {
return db.remove(doc);
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
//response
{
"ok": true,
"id": "mydoc",
"rev": "2-9AF304BE281790604D1D8A4B0F4C9ADB"
}
您还可以通过提供ID和rev来删除文档:
实例用法:
db.get('mydoc').then(function(doc) {
return db.remove(doc._id, doc._rev);
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
您也可以使用put()与{_deleted:true}删除文档:
db.get('mydoc').then(function(doc) {
doc._deleted = true;
return db.put(doc);
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
db.bulkDocs(docs, [options], [callback])
创建,更新或删除多个文档。 docs参数是一个文档数组。
如果在给定文档上省略_id参数,数据库将创建一个新文档并为您分配ID。 要更新文档,必须同时包含_id参数和_rev参数,这些参数应与用于更新的文档的ID和版本相匹配。 最后,要删除文档,请包含值为true的_deleted参数。
实例用法:
放置一些新的文档,提供_ids:
db.bulkDocs([ {title : 'Lisa Says', _id: 'doc1'}, {title : 'Space Oddity', _id: 'doc2'} ]).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
发布一些新文档并自动生成_ids:
db.bulkDocs([
{title : 'Lisa Says'},
{title : 'Space Oddity'}
]).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
//response
[
{
"ok": true,
"id": "doc1",
"rev": "1-84abc2a942007bee7cf55007cba56198"
},
{
"ok": true,
"id": "doc2",
"rev": "1-7b80fc50b6af7a905f368670429a757e"
}
]
该响应包含来自put()/ post()API的熟悉的ok / rev / id数组。 如果有任何错误,它们将被单独提供,如:
[
{ status: 409,
name: 'conflict',
message: 'Document update conflict',
error: true
}
]
结果以与提供的“docs”数组相同的顺序返回。
请注意,bulkDocs()不是事务性的,并且您可以返回错误/非错误的混合数组。 在CouchDB / PouchDB中,最小的原子单位是文档。
您也可以使用bulkDocs()一次更新/删除许多文档:
db.bulkDocs([
{
title : 'Lisa Says',
artist : 'Velvet Underground',
_id : "doc1",
_rev : "1-84abc2a942007bee7cf55007cba56198"
},
{
title : 'Space Oddity',
artist : 'David Bowie',
_id : "doc2",
_rev : "1-7b80fc50b6af7a905f368670429a757e"
}
]).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
//删除
db.bulkDocs([
{
title : 'Lisa Says',
_deleted : true,
_id : "doc1",
_rev : "1-84abc2a942007bee7cf55007cba56198"
},
{
title : 'Space Oddity',
_deleted : true,
_id : "doc2",
_rev : "1-7b80fc50b6af7a905f368670429a757e"
}
]).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
注意:您还可以在options对象上指定一个new_edits属性,当设置为false时,可以从其他数据库发布现有文档。 这将不允许您编辑现有的本地文档,通常只有复制算法需要这样做。
db.allDocs({
include_docs: true,
attachments: true
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
//response
{
"offset": 0,
"total_rows": 1,
"rows": [{
"doc": {
"_id": "0B3358C1-BA4B-4186-8795-9024203EB7DD",
"_rev": "1-5782E71F1E4BF698FA3793D9D5A96393",
"title": "Sound and Vision",
"_attachments": {
"attachment/its-id": {
"content_type": "image/jpg",
"data": "R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==",
"digest": "md5-57e396baedfe1a034590339082b9abce"
}
}
},
"id": "0B3358C1-BA4B-4186-8795-9024203EB7DD",
"key": "0B3358C1-BA4B-4186-8795-9024203EB7DD",
"value": {
"rev": "1-5782E71F1E4BF698FA3793D9D5A96393"
}
}]
}
在回应中,您有三件事:
total_rows数据库中未删除的文档的总数
如果提供,则偏移跳过,或在CouchDB中实际偏移
rows:包含文档的行,如果没有将include_docs设置为true,则只是_id / _revs。
您可以使用startkey / endkey来查找范围内的所有文档:
db.allDocs({
include_docs: true,
attachments: true,
startkey: 'bar',
endkey: 'quux'
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
这将返回在’bar’和’quux’之间的所有包含_ids的文档。
前缀搜索
您可以在allDocs()中执行前缀搜索,即“通过使用特殊的高Unicode字符”\ uffff“为我提供所有其_id以’foo’开头的文档:
db.allDocs({
include_docs: true,
attachments: true,
startkey: 'foo',
endkey: 'foo\uffff'
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
这是因为CouchDB / PouchDB _ids按字典顺序排序。
在数据库中对文档所做的更改的列表,按照它们的顺序。 它返回一个对象与方法cancel(),你调用,如果你不想再听到新的更改。
它是一个事件发射器,将在每次文档更改时发出“更改”事件,在处理所有更改时发出“完成”事件,并在发生错误时发出“错误”事件。 调用cancel()将自动取消订阅所有事件侦听器。
db.changes(options)
注意:options.filter必须设置为“_view”才能使此选项工作。
options.batch_size:仅适用于http数据库,这可以配置一次获取多少更改。增加这个可以减少请求的数量。默认值为25。
options.style:指定在changes数组中返回的修订版本数。默认值’main_only’将只返回当前的“获胜”修订版本;
‘all_docs’将返回所有叶修订(包括冲突和删除的前冲突)。很可能你不会需要这个,除非你正在写一个复制器。
var changes = db.changes({
since: 'now',
live: true,
include_docs: true
}).on('change', function(change) {
// handle change
}).on('complete', function(info) {
// changes() was canceled
}).on('error', function (err) {
console.log(err);
});
changes.cancel(); // whenever you want to cancel
//response
{
"id":"somestuff",
"seq":21,
"changes":[{
"rev":"1-8e6e4c0beac3ec54b27d1df75c7183a8"
}],
"doc":{
"title":"Ch-Ch-Ch-Ch-Changes",
"_id":"someDocId",
"_rev":"1-8e6e4c0beac3ec54b27d1df75c7183a8"
}
}
Change events
未完待续…………