The document provides an overview of using Java to interact with MongoDB. It discusses connecting to MongoDB, working with collections, inserting and querying documents, using GridFS to store files, the object mapping library Morphia, and how Groovy and the Grails framework can simplify MongoDB development. The key topics covered include making connections, inserting and querying documents, GridFS for file storage, mapping objects with Morphia, dynamic queries in Groovy, and the MongoDB Grails plugin.
2. Agenda
Java Driver basics
Making Connections
Managing Collections
BasicDBObjectBuilder
Document Queries
GridFS
Morphia
Beyond the Java language
Groovy utilities
Grails plugin
3. Making a Connection
import com.mongodb.Mongo;
import com.mongodb.DB;
Mongo m = new Mongo();
Mongo m = new Mongo( "localhost" );
Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "mydb" );
4. Working with Collections
Getting all collections in the database
Set<String> colls = db.getCollectionNames();
for (String s : colls) {
System.out.println(s);
}
Getting a single collection
DBCollection coll = db.getCollection("testCollection")
5. Inserting Documents
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
BasicDBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);
doc.put("info", info);
coll.insert(doc);
6. BasicDBObjectBuilder
Utility for building objects
Can coerce Maps (and possibly JSON*) to DBObjects
Example:
BasicDBObjectBuilder.start()
.add( "name" , "eliot" )
.add( "number" , 17 )
.get();
7. Document Queries
DBObject myDoc = coll.findOne();
// can also use
BasicDBObject query = new BasicDBObject(); query.put("i", 71);
DBCursor cur = coll.find(query);
8. GridFS
mechanism for storing files larger than 4MB
files are chunked allowing fetching of a portion or out of
order
chunking is mostly transparent to underlying operating
system
can store files in buckets, a MongoDB metaphor for folders
default is the fs bucket
9. Saving a file to GridFS
def mongo = new Mongo(host)
def gridfs = new GridFS(mongo.getDB("db"))
def save(inputStream, contentType, filename) {
def inputFile = gridfs.createFile(inputStream)
inputFile.setContentType(contentType)
inputFile.setFilename(filename)
inputFile.save()
}
11. Morphia
Apache 2 Licensed
brings Hibernate/JPA paradigms to MongoDB
allows annotating of POJOs to make converting them
between MongoDB and Java very easy
supports DAO abstractions
offers type-safe query support
compatible with GWT, Guice, Spring, and DI frameworks
13. Creating a Morphia POJO
import com.google.code.morphia.annotations.*;
@Entity("collectionName")
public class Contact {
@Id
private String id; //generated by MongoDB
private String firstName;
private String lastName;
@Embedded
private List<PhoneNumber> phoneNumbers;
// getters and setters
}
14. Mapping a POJO to a Mongo doc
Morphia morphia = ...;
Mongo mongo = ...;
DB db = mongo.getDB("contacts");
Contact contact = ...;
// map the contact to a DBObject
DBObject contactObj = morphia.toDBObject(contact);
db.getCollection("personal").save(contactObj);
15. Getting a POJO from a Mongo doc
Morphia morphia = ...;
Mongo mongo = ...;
DB db = mongo.getDB("contacts");
String contactId = ...;
//load the object from the collection
BasicDBObject idObj = new BasicDBObject(
"_id", new ObjectId(contactId)
);
BasicDBObject obj = (BasicDBObject)
db.getCollection("personal").findOne(idObj);
Contact contact = morphia.fromDBObject(Contact.class, obj);
16. DAOs
Encapsulate saving and retrieving objects
Auto-converts to and from POJOs
Can provide constraints on searches
Key functions:
get(<mongoId>)
find() or find(constraints)
findOne(constraints)
deleteById(<mongoId>)
17. DAO Example
import com.mongodb.Mongo
import com.google.code.morphia.*
class EntryDAO extends DAO<BlogEntry,String> {
public EntryDAO(Morphia morphia, Mongo mongo) {
super(mongo, morphia, "entries")
}
}
22. Dynamic Finders
can build complex queries at runtime
can even reach into objects for addition query parameters
Ex. collection.findByAuthorAndPostCreatedGreaterThan(...)
collection.findByComments_CreatedOn(...)
23. How dynamic finders work
Groovy receives the request for the method
The method is not found (invoking methodMissing)
The method name used to construct a query template
The method is cached
The method is invoked with the parameters
Future invocations use the cached method
24. MongoDB Grails Plugin
Replaces JDBC layer in Grails applications
Can use dynamic finders
Requires only slight modifications to domain classes
http://github.com/mpriatel/mongodb-grails
25. Links
Personal Blog: http://jameswilliams.be/blog
Twitter: http://twitter.com/ecspike
Morphia: http://code.google.com/p/morphia
Utilities for Groovy: http://github.com/jwill/groovy-mongo
MongoDB Grails plugin: http://github.
com/mpriatel/mongodb-grails