GUIDES

http://pouchdb.com/guides/

1.建立couchDB环境

  • 下载并安装CouchDB:


    https://couchdb.apache.org/#download

  • 测试:

    • 于CMD下,执行 curl localhost:5984
    • 打开 http://localhost:5984/_utils/fauxton/http://localhost:5984/_utils/ 以进入 CouchDB界面
  • Set _utilsp CORS (用于跨域)

    • 安装:于CMD下,执行 npm install -g add-cors-to-couchdb
    • 运行:于CMD下,执行 add-cors-to-couchdb

2.建立PouchDB环境

3.使用pouchdb数据库

本地数据库

	//创建数据库:
var db = new PouchDB('kittens');

远程数据库

	//创建数据库:
var db = new PouchDB('http://localhost:5984/kittens');

打开http://localhost:5984/kittens可以预览数据库信息

地址解析:
http:// localhost:5984 /kittens
|_____| |____________| |_____|
| | |
Protocol Where CouchDB database
(https if itself is name
Cloudant) hosted

使用info获取数据库信息

	db.info().then(function (info) {
console.log(info);
})

删除本地的所有数据库(Chrome)

4.使用文档数据

文档数据结构:

	SQL concept			PouchDB concept
table <=> no equivalent(不存在表格)
row <=> document(相当于doc)
column <=> field(值域)
primary <=> key primary key (_id)
index <=> view

定义一个doc结构对象,*doc对象必须要有_id属性

	var doc = {
"_id": "mittens",
"name": "Mittens",
"occupation": "kitten",
"age": 3,
"hobbies": [
"playing with balls of yarn",
"chasing laser pointers",
"lookin' hella cute"
]
};

使用put方法存储到数据库

	db.put(doc);

获取数据:(根据_id获取)

	db.get('mittens').then(function (doc) {
console.log(doc);
});

数据版本 (_rev)

_rev:

  • 版本标志位
  • 操作数据时,需要设置该属性

更新数据方法:

手动设置该属性
	doc.age = 4;
doc._rev = "1-bea5fa18e06522d12026f4aee6b15ee4";//(传入当前的_rev属性)
db.put(doc);
获取当前数据,此时即包含_rev属性
	db.get('mittens').then(function (doc) {
// update his age
doc.age = 4;
// put him back
return db.put(doc);
}).then(function () {
// fetch mittens again
return db.get('mittens');
}).then(function (doc) {
console.log(doc);
});

更新数据时,需要传入当前的_rev属性,若不输入_rev属性,会报错如下:

	{
"status": 409,
"name": "conflict",
"message": "Document update conflict"
}

5.异步处理数据

callback:

	db.get('mittens', function (error, doc) {
if (error) {
// oh noes! we got an error
} else {
// okay, doc contains our document
}
});

promises:

	db.get('charlie').then(function (charlie) {
// Within this function, you can do
// try/catch/return like you normally would,
// and it will be handled asynchronously!
}).then(function (result) {
// If the previous function returned something
// (or returned undefined), it will show up here
// as "result".
}).catch(function (err) {
// If the previous function threw an error,
// it will show up here as "err".
});

6.更新删除数据

创建一个默认的doc(若存在则获取,不存在则创建)

	db.get('config').catch(function (err) {
if (err.status === 404) { // not found!
return {
_id: 'config',
background: 'blue',
foreground: 'white',
sparkly: 'false'
};
} else { // hm, some other error
throw err;
}
}).then(function (configDoc) {
// sweet, here is our configDoc
}).catch(function (err) {
// handle any errors
});

删除数据

When you remove() a document, it's not really deleted; it just gets a _deleted attribute added to it)

	//1)直接remove doc
db.get('mydoc').then(function (doc) {
return db.remove(doc);
}); //2) 使用_id,_rev
db.get('mydoc').then(function (doc) {
return db.remove(doc._id, doc._rev);
}); //3) 将_deleted字段设为true
db.get('mydoc').then(function (doc) {
doc._deleted = true;
return db.put(doc);
});

7.Bulk operations (批量操作)

bulkDocs():(批量插入)

	db.bulkDocs([
{
_id: 'mittens',
occupation: 'kitten',
cuteness: 9.0
},
{
_id: 'katie',
occupation: 'kitten',
cuteness: 7.0
},
{
_id: 'felix',
occupation: 'kitten',
cuteness: 8.0
}
]);

allDocs() 批量查询

	db.put({
_id: new Date().toJSON(),
name: 'Mittens',
occupation: 'kitten',
cuteness: 9.0
}).then(function () {
return db.put({
_id: new Date().toJSON(),
name: 'Katie',
occupation: 'kitten',
cuteness: 7.0
});
}).then(function () {
return db.put({
_id: new Date().toJSON(),
name: 'Felix',
occupation: 'kitten',
cuteness: 8.0
});
]).then(function () {
return db.allDocs({include_docs: true});
}).then(function (response) {
console.log(response);
}).catch(function (err) {
console.log(err);
});

8.使用 attachments

base64:

	btoa('hello world')      <=> "aGVsbG8gd29ybGQ="
atob('aGVsbG8gd29ybGQ=') <=> "hello world"

Image attachments

	db.put({
_id: 'meowth',
_attachments: {
'meowth.png': {
content_type: 'image/png',
data: 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAkCAIAAAB0Xu9BAAAABGdBTUEAALGPC/xhBQAAAuNJREFUWEetmD1WHDEQhDdxRMYlnBFyBIccgdQhKVcgJeQMpE5JSTd2uqnvIGpVUqmm9TPrffD0eLMzUn+qVnXPwiFd/PP6eLh47v7EaazbmxsOxjhTT88z9hV7GoNF1cUCvN7TTPv/gf/+uQPm862MWTL6fff4HfDx4S79/oVAlAUwqOmYR0rnazuFnhfOy/ErMKkcBFOr1vOjUi2MFn4nuMil6OPh5eGANLhW3y6u3aH7ijEDCxgCvzFmimvc95TekZLyMSeJC68Bkw0kqUy1K87FlpGZqsGFCyqEtQNDdFUtFctTiuhnPKNysid/WFEFLE2O102XJdEE+8IgeuGsjeJyGHm/xHvQ3JtKVsGGp85g9rK6xMHtvHO9+WACYjk5vkVM6XQ6OZubCJvTfPicYPeHO2AKFl5NuF5UK1VDUbeLxh2BcRGKTQE3irHm3+vPj6cfCod50Eqv5QxtwBQUGhZhbrGVuRia1B4MNp6edwBxld2sl1splfHCwfsvCZfrCQyWmX10djjOlWJSSy3VQlS6LmfrgNvaieRWx1LZ6s9co+P0DLsy3OdLU3lWRclQsVcHJBcUQ0k9/WVVrmpRzYQzpgAdQcAXxZzUnFX3proannrYH+Vq6KkLi+UkarH09mC8YPr2RMWOlEqFkQClsykGEv7CqCUbXcG8+SaGvJ4a8d4y6epND+pEhxoN0vWUu5ntXlFb5/JT7JfJJqoTdy9u9qc7ax3xJRHqJLADWEl23cFWl4K9fvoaCJ2BHpmJ3s3z+O0U/DmzdMjB9alWZtg4e3yxzPa7lUR7nkvxLHO9+tvJX3mtSDpwX8GajB283I8R8a7D2MhUZr1iNWdny256yYLd52DwRYBtRMvE7rsmtxIUE+zLKQCDO4jlxB6CZ8M17GhuY+XTE8vNhQiIiSE82ZsGwk1pht4ZSpT0YVpon6EvevOXXH8JxVR78QzNuamupW/7UB7wO/+7sG5V4ekXb4cL5Lyv+4IAAAAASUVORK5CYII='
}
}
}).then(function () {
return db.getAttachment('meowth', 'meowth.png');
}).then(function (blob) {
var url = URL.createObjectURL(blob);
var img = document.createElement('img');
img.src = url;
document.body.appendChild(img);
}).catch(function (err) {
console.log(err);
});

9.Replication(同步/拷贝 数据)

1.创建本地数据库

	var localDB = new PouchDB('mylocaldb')

2.创建要要远程的数据库

	var remoteDB = new PouchDB('http://localhost:5984/myremotedb')

3.同步本地数据库到远程的数据库

	localDB.replicate.to(remoteDB).on('complete', function () {
// yay, we're done!
}).on('error', function (err) {
// boo, something went wrong!
});

4.双向复制

	localDB.replicate.to(remoteDB);
localDB.replicate.from(remoteDB);

or

	localDB.sync(remoteDB);

	localDB.sync(remoteDB).on('complete', function () {
// yay, we're in sync!
}).on('error', function (err) {
// boo, we hit an error!
});

5.同步的应答操作

	//1.To enable live replication, you simply specify {live: true}:
localDB.sync(remoteDB, {
live: true
}).on('change', function (change) {
// yo, something changed!
}).on('error', function (err) {
// yo, we got an error! (maybe the user went offline?)
}))); //2.You can allow PouchDB to automatically handle this error, and retry until the connection is re-established, by using the retry option:
localDB.sync(remoteDB, {
live: true,
retry: true
}).on('change', function (change) {
// yo, something changed!
}).on('paused', function (info) {
// replication was paused, usually because of a lost connection
}).on('active', function (info) {
// replication was resumed
}).on('error', function (err) {
// totally unhandled error (shouldn't happen)
})));

6.取消同步

	//1.
var syncHandler = localDB.sync(remoteDB, {
live: true,
retry: true
}); syncHandler.on('complete', function (info) {
// replication was canceled!
}); syncHandler.cancel(); // <-- this cancels it //2.
var replicationHandler = localDB.replicate.to(remoteDB, {
live: true,
retry: true
}); replicationHandler.on('complete', function (info) {
// replication was canceled!
}); replicationHandler.cancel(); // <-- this cancels it

10.Map/reduce queries

临时创建:

	//emit()的内容 是 用于查询时的数据(key对应的字段)
//此处的意思就是创建一个index,查找doc.name 为 'foo'的所有数据
db.query(function (doc, emit) {
emit(doc.name);
}, {key: 'foo'}).then(function (result) {
// found docs with name === 'foo'
}).catch(function (err) {
// handle any errors
});

持久性创建:

首先创建一个视图(index)

	//注意 _id 命名规范以   _design/  开头
var ddoc = {
_id: '_design/my_index',
views: {
//以name为查找的属性
by_name: {
map: function (doc) {
emit(doc.name);
}.toString()
}
}
};
// save it
pouch.put(ddoc).then(function () {
// success!
}).catch(function (err) {
// some error (maybe a 409, because it already exists?)
});

然后就可以通过id,视图名直接使用

	//查找name 为test的数据
db.query('my_index/by_name',{
key:'test'
}).then(function (res) {
// got the query results
}).catch(function (err) {
// some error
}); //第一次使用的时候因为要创建视图会相对慢,可以先实行一个空的查询让其先建立视图
db.query('my_index/by_name', {
limit: 0 // don't return any results
}).then(function (res) {
// index was built!
}).catch(function (err) {
// some error
});

Map functions

	//Map functions:
function myMapFunction(doc) {
if (doc.type === 'pokemon') {
if (doc.name === 'Pikachu') {
emit('Pika pi!');
} else {
emit(doc.name);
}
}
} // find pokemon with name === 'Pika pi!'
pouch.query(myMapFunction, {
key : 'Pika pi!',
include_docs : true
}).then(function (result) {
// handle result
}).catch(function (err) {
// handle errors
}); // find the first 5 pokemon whose name starts with 'P'
pouch.query(myMapFunction, {
startkey : 'P',
endkey : 'P\uffff',
limit : 5,
include_docs : true
}).then(function (result) {
// handle result
}).catch(function (err) {
// handle errors
}); //Reduce functions:
// emit the first letter of each pokemon's name
var myMapReduceFun = {
map: function (doc) {
emit(doc.name.charAt(0));
},
reduce: '_count'
};
// count the pokemon whose names start with 'P'
pouch.query(myMapReduceFun, {
key: 'P', reduce: true, group: true
}).then(function (result) {
// handle result
}).catch(function (err) {
// handle errors
});

11.压缩,删除数据库

Compacting a database

return db.compact().then(function (info) {
// compaction complete
}).catch(function (err) {
// handle errors
});

Auto-compaction

	var db = new PouchDB('mydb', {auto_compaction: true});

Destroying a database

	PouchDB.destroy('mydb').then(function () {
// database destroyed
}).catch(function (err) {
// error occurred
})

PouchDB 基础的更多相关文章

  1. PouchDB:JavaScript同步数据库

    简介 PouchDB是受 Apache CouchDB启发为Web设计的一款占用空间少的数据库.PouchDB项目的目标是帮助开发者构建线上和线下都能很好地使用的Web应用程序,在应用程序离线的时候, ...

  2. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  3. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  6. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  7. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  8. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  9. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

随机推荐

  1. 【JAVAWEB学习笔记】06_jQuery基础

    接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...

  2. 如何升级php版本---从php5.5.12 升级php7.1.5 wamp实践

    1.从官网下载一个php7.1.5 2.将刚下载的压缩包解压缩,修改命名为php7.1.5,即php+版本号. 3.将这个文件夹放在wamp/bin/php 目录下. 4.将原来版本的php5.5.1 ...

  3. 新鲜小玩意儿- deviceOrientation移动设备旋转事件

    <javascript高级程序设计>第三版 其中事件的章节 提到一个有意思的事件 deviceOrientation 也就是 设备(device) - orientation(方向) 贴代 ...

  4. YYLabel 自动布局 富文本文字点击事件

    YYLabel显示多行除了需要设置numberOfLines = 0以外,还需要设置preferredMaxLayoutWidth最大的宽度值才可以生效多行效果 YYLabel中的NSMutableA ...

  5. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  6. Java File类应用:递归遍历文件夹和递归删除文件

    要求: 1)采用递归遍历文件夹下的所有文件,包括子文件夹下的文件 2)采用递归删除文件下的所有文件 注意: 以下递归删除文件的方法,只能删除文件,所有的文件夹都还会存在 若要删除正文文件夹,可以在递归 ...

  7. SQL Server AG集群启动不起来的临时自救大招

    SQL Server AG集群启动不起来的临时自救大招 背景 前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群 结果重启WSFC集群之后,非但没有好转,导 ...

  8. 源码分析 Large-Margin Softmax Loss for Convolutional Neural Networks

    作者在Caffe中引入了一个新层,一般情况在Caffe中引入一个新层需要修改caffe.proto,添加该层头文件*.hpp,CPU实现*.cpp,GPU实现*.cu,代码结果如下图所示: caffe ...

  9. 加载jquery插件注意了

    1.尽量放在</body>之前,不要放在</head>标签之前,如果执意要放也要放在css之后,例如: <link href="style.css" ...

  10. 主题模型(概率潜语义分析PLSA、隐含狄利克雷分布LDA)

    一.pLSA模型 1.朴素贝叶斯的分析 (1)可以胜任许多文本分类问题.(2)无法解决语料中一词多义和多词一义的问题--它更像是词法分析,而非语义分析.(3)如果使用词向量作为文档的特征,一词多义和多 ...