SlideShare una empresa de Scribd logo
1 de 149
Apache CouchDB Developer Day
Bradley Holt, Developer Advocate
Thursday, February 9, 2017
Introducing Apache CouchDB 2.0
@BradleyHolt
@BradleyHolt
IBM Cloud Data Services
Open for Data
A comprehensive portfolio of open source data services
What is Apache CouchDB?
Document Database
Apache CouchDB is a JSON document database
HTTP API
Apache CouchDB is accessed through an HTTP API
@BradleyHolt
GET /
GET /db/docPOST /db
DELETE /db/doc
PUT /db/doc
PUT /db
Peer-to-Peer Replication
@BradleyHolt
Cloudant SyncCouchDB PouchDB
CouchDB Replication Protocol
CouchDB
What's new in CouchDB 2.0?
CouchDB 1.x: Standalone
@BradleyHolt
CouchDB
CouchDB 2.0: Clusterered
@BradleyHolt
CouchDB
node1
CouchDB
node2
CouchDB
node3
haproxy
Shards and Replicas
 q=8
– Number of shards
– One or more shards per node
– Cannot have more nodes than shards
 r=2
– Read quorum
 w=2
– Write quorum
 n=3
– Number of replicas of every document
@BradleyHolt
CouchDB
node1
CouchDB
node2
CouchDB
node3
Mango
 Declarative indexes
 MongoDB-style query language
 You can still use map/reduce views
@BradleyHolt
couch_peruser
@BradleyHolt
userdb-51d055
userdb-d76846
userdb-905cec
userdb-adc95b
userdb-c082f2
userdb-730bba
userdb-c3d3e5
userdb-da
userdb-a1ec1f
db-85bcfe
userdb-85a327userdb-9b9aba
What else is new?
 Improved database compaction
 Faster index updates
 New _bulk_get endpoint for
optimized replication
 View-based filters in _changes feed
 Filter _changes feed with _doc_ids
 _all_docs and _changes will
support attachments=true
@BradleyHolt
Installing CouchDB 2.0
Apache CouchDB 2.0 Sandbox Cluster
Try Apache CouchDB 2.0 on an IBM Cloudant sandbox cluster
@BradleyHolt
http-console
http-console
$ npm install http-console -g
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
$ npm install http-console -g
$ http-console 127.0.0.1:5984
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
$ npm install http-console -g
$ http-console 127.0.0.1:5984
> http-console 0.6.3
> Welcome, enter .help if you're lost.
> Connecting to 127.0.0.1 on port 5984.
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
http://127.0.0.1:5984/>
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
http://127.0.0.1:5984/> GET /
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
http://127.0.0.1:5984/> GET /
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
{
couchdb: 'Welcome',
version: '9afa6a0',
vendor: { name: 'The Apache Software Foundation' }
}
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
http://127.0.0.1:5984/>
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
http://127.0.0.1:5984/> .q
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
$ http-console https://bradley-holt.cloudant.com
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
$ http-console https://bradley-holt.cloudant.com
> http-console 0.6.3
> Welcome, enter .help if you're lost.
> Connecting to bradley-holt.cloudant.com on port 443.
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
https://bradley-holt.cloudant.com:443/>
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
https://bradley-holt.cloudant.com:443/> GET /
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
https://bradley-holt.cloudant.com:443/> GET /
HTTP/1.1 200 OK
Content-Type: application/json
{
couchdb: 'Welcome',
version: '9d28c57',
vendor: {
name: 'IBM Cloudant',
version: '5331',
variant: 'paas'
},
features: [ 'geo' ]
}
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
https://bradley-holt.cloudant.com:443/>
@BradleyHolthttps://github.com/cloudhead/http-console
http-console
https://bradley-holt.cloudant.com:443/> .q
@BradleyHolthttps://github.com/cloudhead/http-console
Exploring the CouchDB API
Connecting to CouchDB 2.0
$ http-console root:passw0rd@127.0.0.1:5984 --json
@BradleyHolt
Connecting to CouchDB 2.0
$ http-console root:passw0rd@127.0.0.1:5984 --json
> http-console 0.6.3
> Welcome, enter .help if you're lost.
> Connecting to 127.0.0.1 on port 5984.
@BradleyHolt
Connecting to IBM Cloudant
$ http-console https://bradley-holt:passw0rd@bradley-holt.cloudant.com --json
@BradleyHolt
Connecting to IBM Cloudant
$ http-console https://bradley-holt:passw0rd@bradley-holt.cloudant.com --json
> http-console 0.6.3
> Welcome, enter .help if you're lost.
> Connecting to bradley-holt.cloudant.com on port 443.
@BradleyHolt
Request Headers
/>
@BradleyHolt
Request Headers
/> .headers
@BradleyHolt
Request Headers
/> .headers
Accept: application/json
Content-Type: application/json
Authorization: Basic cm9vdDorMi95N3Y2aA==
Host: 127.0.0.1
@BradleyHolt
PUT a Database
/>
@BradleyHolt
PUT a Database
/> PUT /kittens
@BradleyHolt
PUT a Database
/> PUT /kittens
...
@BradleyHolt
PUT a Database
/> PUT /kittens
...
HTTP/1.1 201 Created
Content-Type: application/json
Location: http://127.0.0.1/kittens
{ ok: true }
@BradleyHolt
PUT a Database Again
/>
@BradleyHolt
PUT a Database Again
/> PUT /kittens
@BradleyHolt
PUT a Database Again
/> PUT /kittens
...
@BradleyHolt
PUT a Database Again
/> PUT /kittens
...
HTTP/1.1 412 Precondition Failed
Content-Type: application/json
{ error: 'file_exists', reason: 'The database could not be created, the file already exists.' }
@BradleyHolt
POST a Document
/>
@BradleyHolt
POST a Document
/> /kittens
@BradleyHolt
POST a Document
/kittens>
@BradleyHolt
POST a Document
/kittens> POST /
@BradleyHolt
POST a Document
/kittens> POST /
...
@BradleyHolt
POST a Document
/kittens> POST /
... { "_id": "mittens", "age_weeks": 10, "weight_kilograms": 0.997 }
@BradleyHolt
POST a Document
/kittens> POST /
... { "_id": "mittens", "age_weeks": 10, "weight_kilograms": 0.997 }
HTTP/1.1 201 Created
Content-Type: application/json
Location: http://127.0.0.1/kittens/mittens
{
ok: true,
id: 'mittens',
rev: '1-e665a40d9ea9711c983e907f0b0b6e8a'
}
@BradleyHolt
GET All Documents
/kittens>
@BradleyHolt
GET All Documents
/kittens> GET /_all_docs
@BradleyHolt
GET All Documents
/kittens> GET /_all_docs
HTTP/1.1 200 OK
Content-Type: application/json
Etag: "92afa0f309a9fd9f140cd31ff5000b5c"
{
total_rows: 1,
offset: 0,
rows: [
{
id: 'mittens',
key: 'mittens',
value: { rev: '1-e665a40d9ea9711c983e907f0b0b6e8a' }
}
]
}
@BradleyHolt
GET a Document
/kittens>
@BradleyHolt
GET a Document
/kittens> GET /mittens
@BradleyHolt
GET a Document
/kittens> GET /mittens
HTTP/1.1 200 OK
Content-Type: application/json
Etag: "1-e665a40d9ea9711c983e907f0b0b6e8a"
{
_id: 'mittens',
_rev: '1-e665a40d9ea9711c983e907f0b0b6e8a',
age_weeks: 10,
weight_kilograms: 0.997
}
@BradleyHolt
PUT an Attachment
/kittens>
@BradleyHolt
PUT an Attachment
/kittens> .headers
@BradleyHolt
PUT an Attachment
/kittens> .headers
Accept: application/json
Content-Type: application/json
Authorization: Basic cm9vdDorMi95N3Y2aA==
Host: 127.0.0.1
@BradleyHolt
PUT an Attachment
/kittens> .headers
Accept: application/json
Content-Type: application/json
Authorization: Basic cm9vdDorMi95N3Y2aA==
Host: 127.0.0.1
/kittens> Content-Type: image/gif
@BradleyHolt
PUT an Attachment
/kittens>
@BradleyHolt
PUT an Attachment
/kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a
@BradleyHolt
PUT an Attachment
/kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a
...
@BradleyHolt
PUT an Attachment
/kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a
... R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=
@BradleyHolt
PUT an Attachment
/kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a
... R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=
HTTP/1.1 201 Created
Content-Type: application/json
Location: http://127.0.0.1/kittens/mittens/photo
{
ok: true,
id: 'mittens',
rev: '2-d858e51453a5785bafe517b7eddc5a98'
}
@BradleyHolt
PUT an Attachment
/kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a
... R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=
HTTP/1.1 201 Created
Content-Type: application/json
Location: http://127.0.0.1/kittens/mittens/photo
{
ok: true,
id: 'mittens',
rev: '2-d858e51453a5785bafe517b7eddc5a98'
}
/kittens>
@BradleyHolt
PUT an Attachment
/kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a
... R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=
HTTP/1.1 201 Created
Content-Type: application/json
Location: http://127.0.0.1/kittens/mittens/photo
{
ok: true,
id: 'mittens',
rev: '2-d858e51453a5785bafe517b7eddc5a98'
}
/kittens> Content-Type: application/json
@BradleyHolt
GET an Attachment
/kittens>
@BradleyHolt
GET an Attachment
/kittens> GET /mittens/photo
@BradleyHolt
GET an Attachment
/kittens> GET /mittens/photo
HTTP/1.1 200 OK
Content-Type: image/gif
Etag: "UsqjdPnY6ApD2ENFOglFHg=="
R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=
@BradleyHolt
Conditional Caching
/kittens>
@BradleyHolt
Conditional Caching
/kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="
@BradleyHolt
Conditional Caching
/kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="
/kittens>
@BradleyHolt
Conditional Caching
/kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="
/kittens> GET /mittens/photo
@BradleyHolt
Conditional Caching
/kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="
/kittens> GET /mittens/photo
HTTP/1.1 304 Not Modified
@BradleyHolt
Conditional Caching
/kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="
/kittens> GET /mittens/photo
HTTP/1.1 304 Not Modified
/kittens>
@BradleyHolt
Conditional Caching
/kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="
/kittens> GET /mittens/photo
HTTP/1.1 304 Not Modified
/kittens> If-None-Match:
@BradleyHolt
DELETE a Document
/kittens>
@BradleyHolt
DELETE a Document
/kittens> DELETE /mittens
@BradleyHolt
DELETE a Document
/kittens> DELETE /mittens
HTTP/1.1 409 Conflict
Content-Type: application/json
{ error: 'conflict', reason: 'Document update conflict.' }
@BradleyHolt
DELETE a Document
/kittens>
@BradleyHolt
DELETE a Document
/kittens> HEAD /mittens
@BradleyHolt
DELETE a Document
/kittens> HEAD /mittens
HTTP/1.1 200 OK
Etag: "2-d858e51453a5785bafe517b7eddc5a98"
@BradleyHolt
DELETE a Document
/kittens>
@BradleyHolt
DELETE a Document
/kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"
@BradleyHolt
DELETE a Document
/kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"
/kittens>
@BradleyHolt
DELETE a Document
/kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"
/kittens> DELETE /mittens
@BradleyHolt
DELETE a Document
/kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"
/kittens> DELETE /mittens
HTTP/1.1 200 OK
Content-Type: application/json
{
ok: true,
id: 'mittens',
rev: '3-d0780627ddff7a7f536fe273100cec41'
}
@BradleyHolt
DELETE a Document
/kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"
/kittens> DELETE /mittens
HTTP/1.1 200 OK
Content-Type: application/json
{
ok: true,
id: 'mittens',
rev: '3-d0780627ddff7a7f536fe273100cec41'
}
/kittens>
@BradleyHolt
DELETE a Document
/kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"
/kittens> DELETE /mittens
HTTP/1.1 200 OK
Content-Type: application/json
{
ok: true,
id: 'mittens',
rev: '3-d0780627ddff7a7f536fe273100cec41'
}
/kittens> If-Match:
@BradleyHolt
Replication
/kittens>
@BradleyHolt
Replication
/kittens> ..
@BradleyHolt
Replication
/kittens> ..
/>
@BradleyHolt
Replication
/kittens> ..
/> DELETE /kittens
@BradleyHolt
Replication
/kittens> ..
/> DELETE /kittens
HTTP/1.1 200 OK
Content-Type: application/json
{ ok: true }
@BradleyHolt
Replication
/>
@BradleyHolt
Replication
/> POST /_replicate
@BradleyHolt
Replication
/> POST /_replicate
...
@BradleyHolt
Replication
/> POST /_replicate
... { "create_target": true, "source": "https://bradley-holt.cloudant.com/kittens", "target": "kittens" }
@BradleyHolt
Replication
/> POST /_replicate
... { "create_target": true, "source": "https://bradley-holt.cloudant.com/kittens", "target": "kittens" }
HTTP/1.1 200 OK
Content-Type: application/json
{
ok: true,
session_id: '9f7bd286a0001ece5bf0bf65dd83c5ab',
source_last_seq: '5-
g1AAAAFDeJzLYWBgYMlgTmGQT0lKzi9KdUhJMtVLykxPyilN1UvOyS9NScwr0ctLLckBKmRKZEiy____f1
YiA6oWQ9xakhyAZFI9SFcGcyJzLpDHbplmZmxkaULYBKIdlscCJBkagBTQov2kuA-
i8wBEJ9iNTGA3mhoampmnGBA2JQsA1LtoyA',
…
}
@BradleyHolt
Mango
/>
@BradleyHolt
Mango
/> /kittens
@BradleyHolt
Mango
/kittens>
@BradleyHolt
Mango
/kittens> POST /_index
@BradleyHolt
Mango
/kittens> POST /_index
...
@BradleyHolt
Mango
/kittens> POST /_index
... { "index": { "fields": [ "age_weeks", "weight_kilograms" ] } }
@BradleyHolt
Mango
/kittens> POST /_index
... { "index": { "fields": [ "age_weeks", "weight_kilograms" ] } }
HTTP/1.1 200 OK
Content-Type: application/json
{
result: 'created',
id: '_design/e19dde7f518129a966ebe072edc66be88d54e694',
name: 'e19dde7f518129a966ebe072edc66be88d54e694'
}
@BradleyHolt
@BradleyHolt
Mango
/kittens>
@BradleyHolt
Mango
/kittens> POST /_find
@BradleyHolt
Mango
/kittens> POST /_find
...
@BradleyHolt
Mango
/kittens> POST /_find
... { "selector": { "age_weeks": { "$gte": 7, "$lte": 10 } }, "fields": [ "_id", "age_weeks" ] }
@BradleyHolt
Mango
/kittens> POST /_find
... { "selector": { "age_weeks": { "$gte": 7, "$lte": 10 } }, "fields": [ "_id", "age_weeks" ] }
HTTP/1.1 200 OK
Content-Type: application/json
{
docs: [
{ _id: 'tiger', age_weeks: 7 },
{ _id: 'daisy', age_weeks: 9 },
{ _id: 'mittens', age_weeks: 10 }
]
}
@BradleyHolt
@BradleyHolt
Mango
/kittens>
@BradleyHolt
Mango
/kittens> POST /_find
@BradleyHolt
Mango
/kittens> POST /_find
...
@BradleyHolt
Mango
/kittens> POST /_find
... { "selector": { "age_weeks": { "$gte": 0 }, "weight_kilograms": { "$gte": 0.5, "$lte": 1 } }, "fields": [ "_id",
"weight_kilograms" ] }
@BradleyHolt
Mango
/kittens> POST /_find
... { "selector": { "age_weeks": { "$gte": 0 }, "weight_kilograms": { "$gte": 0.5, "$lte": 1 } }, "fields": [ "_id",
"weight_kilograms" ] }
HTTP/1.1 200 OK
Content-Type: application/json
{
docs: [
{ _id: 'tiger', weight_kilograms: 0.726 },
{ _id: 'daisy', weight_kilograms: 0.816 },
{ _id: 'mittens', weight_kilograms: 0.997 }
]
}
@BradleyHolt
@BradleyHolt
Contributing
Offline First
Offline First
Lack of connectivity is
not an error condition.
Cloudant Sync
Cloudant
FoodTracker
Cloudant
FoodTracker
Cloudant
Location
Tracker
Offline Camp Berlin
April 28th - May 1st, Berlin, Germany
offlinefirst.org/camp
Image Credits
 paper by malik, on Flickr <https://flic.kr/p/aZjTXv>
 person by Tim Morgan, on Flickr <https://flic.kr/p/7DSF5>
 database by Tim Morgan, on Flickr <https://flic.kr/p/7DUk5>
 gear by Tim Morgan, on Flickr <https://flic.kr/p/7DSF1>
 Mango with section on a white background by bangdoll, on Flickr <https://flic.kr/p/9CBP2h>
@BradleyHolt
Questions?
@BradleyHolt

Más contenido relacionado

La actualidad más candente

Real-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.ioReal-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.io
Rick Copeland
 
Spatial script for my JS.Everywhere 2012
Spatial script for my JS.Everywhere 2012Spatial script for my JS.Everywhere 2012
Spatial script for my JS.Everywhere 2012
Steven Pousty
 
Javascript Continues Integration in Jenkins with AngularJS
Javascript Continues Integration in Jenkins with AngularJSJavascript Continues Integration in Jenkins with AngularJS
Javascript Continues Integration in Jenkins with AngularJS
Ladislav Prskavec
 

La actualidad más candente (20)

2015 555 kharchenko_ppt
2015 555 kharchenko_ppt2015 555 kharchenko_ppt
2015 555 kharchenko_ppt
 
Scrapy workshop
Scrapy workshopScrapy workshop
Scrapy workshop
 
Commit2015 kharchenko - python generators - ext
Commit2015   kharchenko - python generators - extCommit2015   kharchenko - python generators - ext
Commit2015 kharchenko - python generators - ext
 
File handling complete programs in c++
File handling complete programs in c++File handling complete programs in c++
File handling complete programs in c++
 
Real-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.ioReal-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.io
 
今時なウェブ開発をSmalltalkでやってみる?
今時なウェブ開発をSmalltalkでやってみる?今時なウェブ開発をSmalltalkでやってみる?
今時なウェブ開発をSmalltalkでやってみる?
 
Spatial script for my JS.Everywhere 2012
Spatial script for my JS.Everywhere 2012Spatial script for my JS.Everywhere 2012
Spatial script for my JS.Everywhere 2012
 
Sensu wrapper-sensu-summit
Sensu wrapper-sensu-summitSensu wrapper-sensu-summit
Sensu wrapper-sensu-summit
 
Eve - REST API for Humans™
Eve - REST API for Humans™Eve - REST API for Humans™
Eve - REST API for Humans™
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
 
Pydata-Python tools for webscraping
Pydata-Python tools for webscrapingPydata-Python tools for webscraping
Pydata-Python tools for webscraping
 
Javascript Continues Integration in Jenkins with AngularJS
Javascript Continues Integration in Jenkins with AngularJSJavascript Continues Integration in Jenkins with AngularJS
Javascript Continues Integration in Jenkins with AngularJS
 
Spatial script for MongoBoulder
Spatial script for MongoBoulderSpatial script for MongoBoulder
Spatial script for MongoBoulder
 
Tupperware
TupperwareTupperware
Tupperware
 
Webscraping with asyncio
Webscraping with asyncioWebscraping with asyncio
Webscraping with asyncio
 
Application Logging With The ELK Stack
Application Logging With The ELK StackApplication Logging With The ELK Stack
Application Logging With The ELK Stack
 
Awesome Traefik - Ingress Controller for Kubernetes - Swapnasagar Pradhan
Awesome Traefik - Ingress Controller for Kubernetes - Swapnasagar PradhanAwesome Traefik - Ingress Controller for Kubernetes - Swapnasagar Pradhan
Awesome Traefik - Ingress Controller for Kubernetes - Swapnasagar Pradhan
 
Docker for data science
Docker for data scienceDocker for data science
Docker for data science
 
Let's break apache spark workshop
Let's break apache spark workshopLet's break apache spark workshop
Let's break apache spark workshop
 
DaNode - A home made web server in D
DaNode - A home made web server in DDaNode - A home made web server in D
DaNode - A home made web server in D
 

Destacado

Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL Databases
Derek Stainer
 

Destacado (11)

CouchDB Day NYC 2017: Using Geospatial Data in Cloudant & CouchDB
CouchDB Day NYC 2017: Using Geospatial Data in Cloudant & CouchDBCouchDB Day NYC 2017: Using Geospatial Data in Cloudant & CouchDB
CouchDB Day NYC 2017: Using Geospatial Data in Cloudant & CouchDB
 
CouchDB - Introduction - Korean
CouchDB - Introduction - KoreanCouchDB - Introduction - Korean
CouchDB - Introduction - Korean
 
Practical Use of a NoSQL
Practical Use of a NoSQLPractical Use of a NoSQL
Practical Use of a NoSQL
 
CouchDB Vs MongoDB
CouchDB Vs MongoDBCouchDB Vs MongoDB
CouchDB Vs MongoDB
 
GraphDay Stockholm - Levaraging Graph-Technology to fight Financial Fraud
GraphDay Stockholm - Levaraging Graph-Technology to fight Financial FraudGraphDay Stockholm - Levaraging Graph-Technology to fight Financial Fraud
GraphDay Stockholm - Levaraging Graph-Technology to fight Financial Fraud
 
GraphDay Stockholm - Graphs in the Real World: Top Use Cases for Graph Databases
GraphDay Stockholm - Graphs in the Real World: Top Use Cases for Graph DatabasesGraphDay Stockholm - Graphs in the Real World: Top Use Cases for Graph Databases
GraphDay Stockholm - Graphs in the Real World: Top Use Cases for Graph Databases
 
NoSQL databases pros and cons
NoSQL databases pros and consNoSQL databases pros and cons
NoSQL databases pros and cons
 
Time, clocks and the ordering of events
Time, clocks and the ordering of eventsTime, clocks and the ordering of events
Time, clocks and the ordering of events
 
An introduction to CouchDB
An introduction to CouchDBAn introduction to CouchDB
An introduction to CouchDB
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL Databases
 
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQL
 

Similar a CouchDB Day NYC 2017: Introduction to CouchDB 2.0

Apache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestApache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux Fest
Myles Braithwaite
 

Similar a CouchDB Day NYC 2017: Introduction to CouchDB 2.0 (20)

CouchDB Day NYC 2017: Core HTTP API
CouchDB Day NYC 2017: Core HTTP APICouchDB Day NYC 2017: Core HTTP API
CouchDB Day NYC 2017: Core HTTP API
 
curl better
curl bettercurl better
curl better
 
Couchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemCouchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problem
 
Efficient HTTP Apis
Efficient HTTP ApisEfficient HTTP Apis
Efficient HTTP Apis
 
Just curl it!
Just curl it!Just curl it!
Just curl it!
 
HTTP/3 for everyone
HTTP/3 for everyoneHTTP/3 for everyone
HTTP/3 for everyone
 
HTTP/3 in curl
HTTP/3 in curlHTTP/3 in curl
HTTP/3 in curl
 
mastering libcurl part 1
mastering libcurl part 1mastering libcurl part 1
mastering libcurl part 1
 
HTTP/3 over QUIC. All is new but still the same!
HTTP/3 over QUIC. All is new but still the same!HTTP/3 over QUIC. All is new but still the same!
HTTP/3 over QUIC. All is new but still the same!
 
Ethernet Shield
Ethernet ShieldEthernet Shield
Ethernet Shield
 
Ethernet Shield
Ethernet ShieldEthernet Shield
Ethernet Shield
 
Sword v2 at UKCoRR
Sword v2 at UKCoRRSword v2 at UKCoRR
Sword v2 at UKCoRR
 
HTTP/3 is next generation HTTP
HTTP/3 is next generation HTTPHTTP/3 is next generation HTTP
HTTP/3 is next generation HTTP
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
ApacheConNA 2015: What's new in Apache httpd 2.4
ApacheConNA 2015: What's new in Apache httpd 2.4ApacheConNA 2015: What's new in Apache httpd 2.4
ApacheConNA 2015: What's new in Apache httpd 2.4
 
Apache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestApache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux Fest
 
HTTP/3 in curl 2020
HTTP/3 in curl 2020HTTP/3 in curl 2020
HTTP/3 in curl 2020
 
ApacheCon Testing Camel K with Cloud Native BDD
ApacheCon Testing Camel K with Cloud Native BDDApacheCon Testing Camel K with Cloud Native BDD
ApacheCon Testing Camel K with Cloud Native BDD
 
Automating Cloud Operations: Everything You Wanted to Know about cURL and REST
Automating Cloud Operations: Everything You Wanted to Know about cURL and RESTAutomating Cloud Operations: Everything You Wanted to Know about cURL and REST
Automating Cloud Operations: Everything You Wanted to Know about cURL and REST
 
OSCON 2011 Learning CouchDB
OSCON 2011 Learning CouchDBOSCON 2011 Learning CouchDB
OSCON 2011 Learning CouchDB
 

Más de IBM Cloud Data Services

Machine Learning with Apache Spark
Machine Learning with Apache SparkMachine Learning with Apache Spark
Machine Learning with Apache Spark
IBM Cloud Data Services
 
Analyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGIS
Analyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGISAnalyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGIS
Analyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGIS
IBM Cloud Data Services
 

Más de IBM Cloud Data Services (14)

I See NoSQL Document Stores in Geospatial Applications
I See NoSQL Document Stores in Geospatial ApplicationsI See NoSQL Document Stores in Geospatial Applications
I See NoSQL Document Stores in Geospatial Applications
 
Webinar: The Anatomy of the Cloudant Data Layer
Webinar: The Anatomy of the Cloudant Data LayerWebinar: The Anatomy of the Cloudant Data Layer
Webinar: The Anatomy of the Cloudant Data Layer
 
NoSQL for SQL Users
NoSQL for SQL UsersNoSQL for SQL Users
NoSQL for SQL Users
 
dashDB: the GIS professional’s bridge to mainstream IT systems
dashDB: the GIS professional’s bridge to mainstream IT systemsdashDB: the GIS professional’s bridge to mainstream IT systems
dashDB: the GIS professional’s bridge to mainstream IT systems
 
Cloud Data Services: A Brand New Ballgame for Business
Cloud Data Services: A  Brand New Ballgame for BusinessCloud Data Services: A  Brand New Ballgame for Business
Cloud Data Services: A Brand New Ballgame for Business
 
Practical Use of a NoSQL Database
Practical Use of a NoSQL DatabasePractical Use of a NoSQL Database
Practical Use of a NoSQL Database
 
SQL To NoSQL - Top 6 Questions Before Making The Move
SQL To NoSQL - Top 6 Questions Before Making The MoveSQL To NoSQL - Top 6 Questions Before Making The Move
SQL To NoSQL - Top 6 Questions Before Making The Move
 
Machine Learning with Apache Spark
Machine Learning with Apache SparkMachine Learning with Apache Spark
Machine Learning with Apache Spark
 
Mobile App Development With IBM Cloudant
Mobile App Development With IBM CloudantMobile App Development With IBM Cloudant
Mobile App Development With IBM Cloudant
 
IBM Cognos Business Intelligence using dashDB
IBM Cognos Business Intelligence using dashDBIBM Cognos Business Intelligence using dashDB
IBM Cognos Business Intelligence using dashDB
 
Run Oracle Apps in the Cloud with dashDB
Run Oracle Apps in the Cloud with dashDBRun Oracle Apps in the Cloud with dashDB
Run Oracle Apps in the Cloud with dashDB
 
Analyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGIS
Analyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGISAnalyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGIS
Analyzing GeoSpatial data with IBM Cloud Data Services & Esri ArcGIS
 
Get Started Quickly with IBM's Hadoop as a Service
Get Started Quickly with IBM's Hadoop as a ServiceGet Started Quickly with IBM's Hadoop as a Service
Get Started Quickly with IBM's Hadoop as a Service
 
Introducing dashDB MPP: The Power of Data Warehousing in the Cloud
Introducing dashDB MPP: The Power of Data Warehousing in the CloudIntroducing dashDB MPP: The Power of Data Warehousing in the Cloud
Introducing dashDB MPP: The Power of Data Warehousing in the Cloud
 

Último

%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 

Último (20)

%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 

CouchDB Day NYC 2017: Introduction to CouchDB 2.0

Notas del editor

  1. A comprehensive portfolio of open source data services A rich, curated open data catalog that adds meaning to your data Services that connect integrate hybrid data from internal and external data sources and connect to analytics offerings Fully managed and open for business 24/7/365
  2. Brings horizontal scalability to CouchDB CouchDB 2.0 can be configured for standalone mode
  3. Can add and remove nodes to a cluster at will Cannot reshard, so preshard instead Presharding, no resharding If you need more shards, create a new cluster and migrate over
  4. enable If set to true, couch_peruser ensures that a private per-user database exists for each document in _users. These databases are writable only by the corresponding user. Databases are in the following form: userdb-{hex encoded username}. delete_dbs If set to true and a user is deleted, the respective database gets deleted as well.
  5. The Cloudant and CouchDB 2.0 codebases are merging Clustering and Mango have been available on Cloudant for quite awhile
  6. HTTP Basic authentication is a simple way to authenticate with an HTTP server Other approaches, such as cookies and OAuth, are often used as well
  7. Resources can be represented in different content types
  8. … I hope that I’ve convinced you that you shouldn’t build your apps to rely on a network connection. But what’s the alternative? You have two basic options: graceful degradation or progressive enhancement. Graceful degradation involves building your app as usual, assuming that it will have a good network connection, and then gracefully handling the resultant errors when the network connection inevitably does not work. The progressive enhancement approach involves assuming that, as a baseline, your app will not have a working network connection. Then, your app can be progressively enhanced to take advantage of network connectivity when available.
  9. The progressive enhancement approach is what we call Offline First. Don’t assume that lack of connectivity is an error condition. Build your app to work without a connection. Get updated content, sync your data, or enable features that aren’t practical to make work offline when the app is connected. Let users still interact with your app when there’s no reliable connection available.
  10. The term Offline First was first coined by Alex Feyerke in a 2013 A List Apart article. The open source Hoodie project (which Alex and others work on) was probably the first framework to embrace the Offline First moniker and approach. Around the same time that Hoodie was created PouchDB was also created. PouchDB is a JavaScript database that syncs. More recently, Service Workers were introduced into Google Chrome, enabling new Offline First use cases in web browsers. Firefox and Opera have also implemented Service Workers, and Microsoft Edge plans to support Service Workers as well.
  11. … If you’ve heard of Progressive Web Apps then some of what I’ve talked about probably sounds familiar. The basic idea of Progressive Web Apps is to combine the discoverability of web apps with the power of native mobile apps. As an end user, you browse to a Progressive Web App just like you would browse to any other website. As you use the app more-and-more, it gains additional native-app-like capabilities. For example, installation to your home screen or the ability to send you alerts and notifications.
  12. Google is currently making a big push for Progressive Web Apps and many companies have invested in building Progressive Web Apps. For example, The Weather Company, which IBM recently acquired, has built a Progressive Web App which allows them to send alerts and notifications to users. Progressive Web Apps are an opportunity for web developers to rethink how we approach building web apps. The market has clearly demonstrated that it likes the interaction model of native apps. There’s a lot that we can learn from how native apps are built. Don’t get me wrong, I’m a huge believer in the power of the open web. I don’t think we should just turn web apps into native apps and call it done. I do think that we can incorporate some of the best parts of native apps into how we build web apps while not losing the soul of the open web.
  13. I encourage you to also check out PouchDB. It’s not as lightweight as localForage, but it includes a bunch of awesome features that are probably worth the extra overhead. The most exciting feature of PouchDB is its ability to sync with anything that implements the CouchDB Replication Protocol. This, of course, includes Apache CouchDB. It also includes IBM Cloudant, a fully-managed cloud database that is based on CouchDB. PouchDB allows you to read and write data directly on the device, and then sync this data to the cloud when you have an internet connection. This makes create, read, update, and delete operations extremely fast as all of your data access happens locally.
  14. Not only can PouchDB run in a web browser, but it can also run in any JavaScript environment including in Node.js, in Apache Cordova or Ionic for hybrid mobile apps, in Electron for desktop apps, and even on a Tessel for Internet of Things (IoT) apps. Nolan Lawson, one of the core contributors to PouchDB, has written up some excellent demos of running PouchDB in these environments and others.
  15. Our team at IBM Cloudant also created open source Cloudant Sync libraries for iOS and Android, in case you prefer to build native mobile apps and would like to take an Offline First approach. While they have different APIs than PouchDB, these libraries, like PouchDB, store data locally on the device and can also sync with anything that implements the CouchDB Replication Protocol.
  16. … Our Developer Advocacy team has built several Offline First sample apps to help you learn how to build Offline First apps. Cloudant FoodTracker is an app that we created to demonstrate how to build an Offline First iOS app in Swift using Cloudant Sync. Apple provides a great tutorial on starting to develop iOS apps in Swift. The tutorial walks readers through creating a simple meal tracking app. The app allows users to view and edit a list of meals. Each meal includes a meal name, rating, and a photo.
  17. Apple’s FoodTracker is offline-only, meaning that all of the meal data is stored only on the device and the app provides no means of syncing that data to the cloud. Cloudant FoodTracker replaces the data layer with Cloudant Sync and then syncs with Cloudant or CouchDB.
  18. Field Work is a web app that allows offline editing and mapping of geospatial data. The idea of Field Work is to demonstrate how a company in a field-based industry, such as the utility industry, could benefit from an app which their field personnel could use even when disconnected.
  19. Field Work stores GeoJSON locally on the device in PouchDB. It uses Leaflet and Mapbox.js to render the geospatial data on a map. Read-only base map layers are synced from a Cloudant database to a PouchDB database on the device. An editable map layer is then synced between a separate Cloudant database and a separate PouchDB database on the device. There are other aspects to the app, including the ability create work orders.
  20. Location Tracker is another iOS sample app, written in Swift. The app tracks a user’s location as they move and stores this data in a local Cloudant Sync database, which is synced with Cloudant when an internet connection is available. As a user moves, and new locations are recorded, the app queries the server for points of interests near the user’s location. Blue pins mark each location recorded by the app. A blue line is drawn over the path the user has travelled. Each time the Location Tracker app records a new location a radius-based geo query is performed in Cloudant to find nearby points of interest.