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环境

  • 下载

    • https://pouchdb.com/download.html
  • 在html页面引入
    • <script src="pouchdb-3.4.0.min.js"></script>

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           nameCloudant)    hosted

使用info获取数据库信息

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

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

  • 使用ClearBrowserData
  • 清除浏览器缓存

4.使用文档数据

文档数据结构:

    SQL concept         PouchDB concepttable       <=>     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 agedoc.age = 4;// put him backreturn db.put(doc);}).then(function () {// fetch mittens againreturn 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 errorthrow 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 docdb.get('mydoc').then(function (doc) {return db.remove(doc);});//2) 使用_id,_revdb.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 itpouch.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 namevar 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})

转载于:https://www.cnblogs.com/final-elysion/p/6026848.html

PouchDB 基础相关推荐

  1. linux git服务器搭建端口号是多少,Linux 环境 搭建Git 服务器,并且修改SSH端口使用...

    1.环境配置说明 服务器 CentOS 7 + git(git version 1.8.3.1) 客户端 Windows10 + SourceTree 2.安装 Git 服务器端安装: sudo yu ...

  2. java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】

    类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...

  3. 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作

    上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...

  4. java mybatis基础

    java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...

  5. 【J2SE】学习基础

    Java基础 语法基础 OO Exception Array 基础类 I/O Stream Collection/Generic Thread TCP/UDP GUI Meta Data Regula ...

  6. 【Linux系统】基础总结

    我不太清楚运维部门具体是做什么的,就接触过一点点运维部门! 也就是是知道他们负责管理服务器,管理网络,管理项目部署 偶尔自己需要部署,不得不接触一些linux命令.简单总结一些基础 linux系统发展 ...

  7. 【Java 2 Platform Enterprise Edition】基础

    问题1:为什么java是无关平台? 你之前用C或者C++写的源代码,编译好后,换一种操作系统,可能就执行不了了.因为新的操作系统不识别,你需要修改你的源码,并在新的操作系统上重新编译才能运行,比如Wi ...

  8. SpringCloud Alibaba微服务实战(一) - 基础环境搭建

    说在前面 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来 ...

  9. Redis概述和基础

    Redis 1.NoSQL NoSQL = Not Only SQL(不仅仅是SQL) 泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的 ...

  10. pass基础架构分析

    pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...

最新文章

  1. .net framework 4.0安装_Win 7无法安装Microsoft .NET Framework 4.6.2
  2. java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串
  3. SAP UI5 初学者教程之十九 - SAP UI5 数据类型和复杂的数据绑定
  4. 【实例分割】cvpr2021_Look Closer to Segment Better
  5. Java和pathion_Spring配置中的classpath:与classpath*:的区别
  6. vue 中 provide 和 inject 共享数据
  7. UI完美素材|(Watch展示篇)Mockups动态图提案模板
  8. linux包含绝对路径头文件,linux-kernel - 访问用户空间内存访问函数(如access_ok(),get_from_user())需要包含的头文件的确切路径。 - 堆栈内存溢出...
  9. NMS(非极大值抑制)算法 -- 理论、代码
  10. 给为工作而焦急迷茫的你
  11. NLP特征工程(待完善细节)
  12. abaqus编写本构方程vumat_abaqus vumat sdv
  13. WPS Office Pro v10.8.2.6726 绿色便携专业增强版
  14. 自然辩证法2018版_(完整word版)2018年《自然辩证法概论》已整理
  15. 开发者选项看html,手机怎么打开开发者选项?开发者模式开启方法
  16. APP项目完整工作流程
  17. 40个web前端实战项目,练完即可就业,从入门到进阶,基础到框架,html_css【附视频+源码】
  18. Linux 中的逻辑卷 LVM 管理完整初学者指南
  19. word论文页眉的横线怎么删除去掉
  20. android中contains的用法

热门文章

  1. java 并发容器类实验_Java多线程并发编程中并发容器第二篇之List的并发类讲解...
  2. 一些用CRF做图像语义分割的资源
  3. Caffe学习:使用pycaffe读取caffemodel参数
  4. 7个开源的SNS社交网络平台
  5. Tf-idf推导及理解
  6. matlab preparets,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?
  7. 在linux中配置编译u-boot方法,U-Boot编译过程解析
  8. dotenv 是什么 怎么使用
  9. C++ std::set operator <= find失效 erase失效 解决方案
  10. 装箱问题 BPP first fit、best fit、first fit decreasing、best fit decreasing