Introduction
Apache CouchDB, commonly referred to as CouchDB, is an open source database that focuses on ease of use and on being "a database that completely embraces the web".
It is a NoSQL database that uses JSON to store data, JavaScript as its query language using MapReduce and HTTP for an API.
One of its distinguishing features is multi-master replication.
Couch is an acronym for cluster of unreliable commodity hardware
A
CouchDB database lacks a schema, or rigid pre-defined data structures
such as tables. Data stored in CouchDB is a JSON document(s).
The structure of the data, or document(s), can change dynamically to accommodate evolving needs.
CouchDB also offers a built-in administration interface accessible via web called Futon.
Main features
Document Storage:
CouchDB
stores data as "documents", as one or more field/value pairs expressed
as JSON. Field values can be simple things like strings, numbers, or
dates; but ordered lists and associative arrays can also be used. Every
document in a CouchDB database has a unique id and there is no required
document schema.
REST API:
All
items have a unique URI that gets exposed via HTTP. REST uses the HTTP
methods POST, GET, PUT and DELETE for the four basic CRUD (Create, Read,
Update, Delete) operations on all resources.
Schema-Free:
Unlike
SQL databases, which are designed to store and report on highly
structured, interrelated data, CouchDB is designed to store and report
on large amounts of semi-structured, document oriented data. CouchDB
greatly simplifies the development of document oriented applications,
such as collaborative web applications.
In
an SQL database, the schema and storage of the existing data must be
updated as needs evolve. With CouchDB, no schema is required, so new
document types with new meaning can be safely added alongside the old.
However, for applications requiring robust validation of new documents
custom validation functions are possible. The view engine is designed to
easily handle new document types and disparate but similar documents.
Installation (Ubuntu)
sudo apt-get install couchdb -y
sudo chown -R couchdb /var/run/couchdb
sudo dpkg --configure couchdb
*For installation on other Operating Systems - http://wiki.apache.org/couchdb/Installation
CouchDB Java Client
CouchDB4J Example
CouchDB4J is an updated Java library for CouchDB.
It handles the REST style calls to the CouchDB server behind the scenes, and give you a handle on the JSON objects directly.
CouchDB4J
uses JSON-lib to handle mapping to/from JSON objects, which makes
getting/setting properties on the objects very easy.
You can even map Java objects to JSON objects and back to make the process easier.
Example:
Structure:
CouchDBCompleteDemo.java
package com.couchdb.demo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.simple.JSONValue;
import com.fourspaces.couchdb.Database;
import com.fourspaces.couchdb.Document;
import com.fourspaces.couchdb.Session;
import com.fourspaces.couchdb.ViewResults;
public class CouchDBCompleteDemo {
static Session dbSession ;
static Database db;
public static void main(String[] args) {
String dbName = "foodb";
createDatabase(dbName);
saveDocument(getDocument("1", "Willian", "J2EECOE", "TL", "Android"));
saveDocument(getDocument("2", "Joanne", "J2EECOE", "Developer", "Java"));
saveDocument(getDocument("3", "suzzane", "J2EECOE", "Sr. Developer", "Java"));
saveDocument(getDocument("4", "Harley", "J2EECOE", "Sr. Developer", "Java"));
saveDocument(getDocument("5", "Julian", "J2EECOE", "Developer", "Java"));
saveDocument(getDocument("6", "Peter", "J2EECOE", "Developer", "Java"));
getTotalDocumentCount();
viewAllDocuments();
viewsDemo();
// deleteDocument("6");
// getTotalDocumentCount();
// deleteDatabase(dbName);
}
public static void createDatabase(String dbName){
dbSession = new Session("localhost", 5984);
db = dbSession.createDatabase(dbName);
if(db==null)
db = dbSession.getDatabase(dbName);
}
public static Document getDocument(String id,String name,String group,String designation,String language){
Document doc = new Document();
doc.setId(id);
doc.put("EmpNO", id);
doc.put("Name", name);
doc.put("Group", group);
doc.put("Designation", designation);
doc.put("Language", language);
return doc;
}
public static void saveDocument(Document doc){
try {
db.saveDocument(doc);
} catch (Exception e) {
}
}
public static int getTotalDocumentCount(){
int count = db.getDocumentCount();
System.out.println("Total Documents: " + count);
return count;
}
public static void deleteDocument(String id){
Document d = db.getDocument(id);
System.out.println("Document 1: " + d);
db.deleteDocument(d);
}
public static void deleteDatabase(String dbName){
dbSession.deleteDatabase(dbName);
}
public static void viewAllDocuments(){
ViewResults results = db.getAllDocuments();
List<Document> documentsList = results.getResults();
if(documentsList!=null)
{
for(Document doc : documentsList)
{
System.out.println(doc.get("id") + " : " + doc);
}
}
}
public static void viewsDemo(){
if(db!=null)
{
Document doc = null;
try {
doc = db.getDocument("_design/couchview");
} catch (Exception e1) {
doc = null;
}
try {
if(doc==null)
{
doc = new Document();
doc.setId("_design/couchview");
String str = "{\"javalanguage\": {\"map\": \"function(doc) { if (doc.Language == 'Java') emit(null, doc) } \"}, \"java_and_se\": {\"map\": \"function(doc) { if (doc.Language == 'Java' & doc.Designation == 'SE') emit(null, doc) } \"}}";
doc.put("views", str);
db.saveDocument(doc);
}
} catch (Exception e) {
}
}
try {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet get = new HttpGet("http://localhost:5984/foodb/_design/couchview/_view/javalanguage");
HttpResponse response = httpclient.execute(get);
HttpEntity entity=response.getEntity();
InputStream instream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
String strdata = null;
String jsonString = "" ;
while( (strdata =reader.readLine())!=null)
{
// System.out.println(strdata);
jsonString += strdata;
}
System.out.println("Json String: " + jsonString);
Map<String, Object> jsonMap = getMapFromJsonString(jsonString);
if(jsonMap!=null)
{
System.out.println("total_rows: " + jsonMap.get("total_rows"));
System.out.println("offset: " + jsonMap.get("offset"));
List<Map> rowsList = (List<Map>) jsonMap.get("rows");
if(rowsList!=null)
{
for(Map row: rowsList)
{
System.out.println("----------------");
System.out.println("Id: " + row.get("id"));
System.out.println("Value: " + row.get("value"));
System.out.println("Name: " + ((Map)row.get("value")).get("Name"));
System.out.println("_id: " + ((Map)row.get("value")).get("_id"));
System.out.println("Language: " + ((Map)row.get("value")).get("Language"));
System.out.println("EmpNO: " + ((Map)row.get("value")).get("EmpNO"));
System.out.println("Designation: " + ((Map)row.get("value")).get("Designation"));
System.out.println("Group: " + ((Map)row.get("value")).get("Group"));
}
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Map<String, Object> getMapFromJsonString(String jsonString){
Map<String, Object> jsonMap = (Map<String, Object>) JSONValue.parse(jsonString);
System.out.println("Json Map: " + jsonMap);
return jsonMap;
}
}