Published on Sep 5 2013 in Databases Java

MongoDB is leader amongst NoSQL databases and all our Java hosting packages support it. Here is MongoDB Java primer that you can find useful before reaching for comprehensive MongoDB Java API docs.

MongoDB terminology

As the NoSQL term suggests - things are a bit different in MongoDB then in the SQL world. See the table for keywords.

NoSQL Item Description SQL counterpart
database set of collections database
collection set of documents (also referred to as objects) table
document (object) set of fileds row
field a key-value pair column

[MongoDB logo
A key is a name (string) identifier and a value is a basic type. Basic types include string, integer, float, timestamp, binary, a document object, or an array.

To better understand the differences see most common queries in MySQL, Mongo and Mongo Java API dialects.

Insert

MySQL: INSERT INTO Staff (name, position) VALUES ('John Doe','Senior Java Developer')

Mongo: db.staff.insert({name:'John Doe',position:'Senior Java Developer'})

Mongo Java API: staff.insert(new BasicDBObject().append("name", "John Doe").append("position", "Senior Java Developer"));

Select

MySQL: SELECT name FROM Staff WHERE position = 'Senior Java Developer' ORDER BY name DESC

Mongo: db.staff.find({position:'Senior Java Developer'}, {name:1,position:0}).sort({name:-1})

Mongo Java API: BasicDBObject sortOrder = new BasicDBObject();
sortOrder.put("name", -1);
staff.find(new BasicDBObject("position", "Senior Java Developer"), new BasicDBObject("name", 1)).sort(sortOrder)

Update

MySQL: UPDATE Staff SET position = 'Java Team Leader' WHERE name='John Smith'

Mongo: db.staff.update({name:"John Smith"}, {$set:{position:"Java Team Leader"}})

Mongo Java API: BasicDBObject newDoc = new BasicDBObject();
newDoc.append("$set", new BasicDBObject().append("position", "Java Team Leader"));
staff.update(new BasicDBObject("name", "John Smith"), newDoc);

Delete

MySQL: DELETE FROM Staff WHERE position = 'Senior Java Developer'

Mongo: db.staff.remove({ position: "Senior Java Developer" }, 1)

Mongo Java API: staff.remove(new BasicDBObject().append("position","Senior Java Developer"));

In SELECT, note that when excluding a field in projection you cannot pass fields other than the _id field with '0' value. All other (excluded) fields must be absent. Included fields will have '1' value.

As you can see commands of the JDBC API differ a bit from the commands of Mongo shell. In Java/JSP you provide criteria and projection as BasicDBObjects. Refer to Mongo JDBC API for commands and correct syntax.

You will only be able to access data in a database assigned to you and after connecting to it with your credentials. MongoDB will implicitly create a collection when it first saves data to it. RockMongo is popular web based frontend that you can install in your public_html, but usually you will not need to bother as everything can be done from mongo shell.

MongoDB and Java hosting - quick guide

Request MongoDB database creation with a ticket - cPanel does not provide MongoDB management tool

You will get your MongoDB access details (username will be replaced by your hosting username and x.server.net by the server name where your database is created). For example

== MongoDB setup ==
local connection string: mongodb://username_mongouser:secret@localhost/username_mongodb 
remote connection string: mongodb://username_mongouser:[email protected]/username_mongodb
local access example: mongo -u username_mongouser -p secret localhost/username_mongodb
remote access example: mongo -u username_mongouser -p secret x.server.net/username_mongodb
database name: username_mongodb
database user: username_mongouser
database user password: secret

Download MongoDB JDBC driver to your web app WEB-INF/lib directory

For quick access you can save it to webapps/ROOT/WEB-INF/lib.

wget https://github.com/downloads/mongodb/mongo-java-driver/mongo-2.10.1.jar

Run JSP Mongo testing script

Get the JSP testing script, save it as mongodb.jsp in your webapps/ROOT directory (or another webapp driectory where you saved mongo.jar) and update your MongoDB credentials inside. The code follows:

<%@page import="com.mongodb.*" %>
<%@page import="java.util.*,java.text.SimpleDateFormat" %>
<%
String database = "username_mongodb";
String username = "username_mongouser";
String pass = "secret";
char[] password = pass.toCharArray();
String coll = "";

try {
 MongoClient mongoClient = new MongoClient();
 DB db = mongoClient.getDB(database);
 boolean auth = db.authenticate(username, password);

 DBCollection staff = db.getCollection("Staff");
 DBCollection access = db.getCollection("Access");

 if (request.getParameter("Submit") != null && request.getParameter("Submit").equals("Drop collections")) {
  staff.drop(); access.drop();
 }

 out.println("<h4>Collections list</h4>");
  Set<String> colls = db.getCollectionNames();
  for (String s : colls) {
  out.println(s+", ");
 }

 coll = "Access";
 out.println("<h4>" + coll + "</h4>");
 out.println("Collection '" + coll + "' count: "+ access.count() + "<br/>");

 Date date=new Date();
 String dateString = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
 out.println("Current datetime: "+dateString+"<br/>");

 DBObject lastAccess = access.findOne(); // find().limit(1) much faster

 if (lastAccess != null) {
  out.println("<h5>Updating" + coll +"</h5>");
  BasicDBObject newDoc = new BasicDBObject("_id", lastAccess.get("_id")).append("datetime", dateString);
  access.save(newDoc);
  out.println("Saved datetime (last access): "+lastAccess.get("datetime")+"<br/>");
 } else {
  out.println("<h5>Inserting " + coll + "</h5>");
  BasicDBObject doc = new BasicDBObject("datetime", dateString);
  access.insert(doc);
  lastAccess = access.findOne(); 
  out.println("Saved datetime (last access): "+lastAccess.get("datetime")+"<br/>");
 }

// using cursor
 coll = "Staff";
 out.println("<h4>" + coll + "</h4>");
 out.println("Collection '" + coll + "' count: "+ staff.count() + "<br/>");

 // prepare query 
 DBObject clause1 = new BasicDBObject("name", "John Doe");
 DBObject clause2 = new BasicDBObject("name", "John Smith");
 BasicDBList clauses = new BasicDBList();
 clauses.add(clause1); clauses.add(clause2);
 DBObject criteria = new BasicDBObject("$or", clauses);

 // if staff documents do not exist - create them
 if (! staff.find(criteria).hasNext()) {
  // insert docs
  out.println("<h5>Inserting " + coll + "</h5>");
   staff.insert(new BasicDBObject().append("name", "John Smith").append("position", "Junior Java Developer"));
  staff.insert(new BasicDBObject().append("name", "John Doe").append("position", "Senior Java Developer"));
  staff.insert(new BasicDBObject().append("name", "Bill Moe").append("position", "Manager"));
 }

 // find and print staff - ordered
 BasicDBObject sortOrder = new BasicDBObject();
 sortOrder.put("name", -1); // order DESC

 DBCursor cursor = staff.find().sort(sortOrder);
 try {
  while (cursor.hasNext()) {
  DBObject object = cursor.next();
  out.println(object.get("name") + " " + object.get("position") + "<br/>");
  }
 } finally { cursor.close(); }

 // create index
 staff.createIndex(new BasicDBObject("name", 1)); // create index on "name", ascending
 List<DBObject> list = staff.getIndexInfo();
 out.println("<h4>" + coll + " - Indexes</h4>");

 // find and print indexes
 for (DBObject o : list) { out.println(o.get("name")+", "); }

 // find Senior Java Developers
 out.println("<h4>" + coll + " - Senior Java Developers only</h4>");  

 //> db.staff.find({position:"Senior Java Developer"})
 cursor=staff.find(new BasicDBObject("position", "Senior Java Developer"));
 try {
  while (cursor.hasNext()) {
   DBObject object = cursor.next();
  out.println(object.get("name") + " " + object.get("position") + "<br/>");
  }
 } finally { cursor.close(); }

 // find Staff - updated position
 out.println("<h4>" + coll + " - position updated</h4>");  

 // update a value in doc
 BasicDBObject newDoc = new BasicDBObject();
 // this would replace whole doc instead of updating single value
 // newDoc.put("position", "Java Team Leader");
 newDoc.append("$set", new BasicDBObject().append("position", "Java Team Leader"));
 staff.update(new BasicDBObject("name", "Bill Moe"), newDoc);

 cursor = staff.find().sort(sortOrder);
 try {
   while (cursor.hasNext()) {
   DBObject object = cursor.next();
  out.println(object.get("name") + " " + object.get("position") + "<br/>");
  }
 } finally { cursor.close(); }

 // delete a doc
 out.println("<h4>" + coll + " - Staff member deleted</h4>");  
 staff.remove(new BasicDBObject().append("position","Junior Java Developer"));

 cursor = staff.find().sort(sortOrder);
 try {
  while (cursor.hasNext()) {
  DBObject object = cursor.next();
  out.println(object.get("name") + " " + object.get("position") + "<br/>");
  }
 } finally { cursor.close(); }

%><br/><form method="post">
<input type="submit" name="Submit" value="Drop collections">
<input type="button" value="Refresh" onclick="location.href=document.URL;">
</form><%
} catch(MongoException e) {
 out.println(e.getMessage());
 e.printStackTrace();
}
%>

Run the Java/Mongo tests from your browser

Access http://username.jvmhost.net/mongodb.jsp and see how it creates and updates documents and collections. To reset the tests click Drop collections - it will start from scratch. To see what changes on subsequent calls click Refresh.

Using Mongo shell

You can use the sent MongoDB details to connect to MongoDB remotely on default port (27017) using you local copy of mongo client. Altenatively you can login via SSH to the server and then use localhost as your server name.

As you can see Java hosting with Mongo is as simple as adding JDBC driver into your web application's WEB-INF/lib or Tomcat's lib. Still you may need some time to come to grips wih Mongo and Mongo Java API syntaxes.

Further reading:
Spring and MongoDB
SQL and Mongo DB NoSQL Getting started with MongoDB Java driver