java development with mongodb
Post on 18-Oct-2014
52.543 views
DESCRIPTION
Presented at MongoSF on April 30, 2010.TRANSCRIPT
Java Development with MongoDBJames Williams
Software Engineer, BT/Ribbit
Agenda
Java Driver basicsMaking ConnectionsManaging CollectionsBasicDBObjectBuilderDocument QueriesGridFS
MorphiaBeyond the Java language
Groovy utilitiesGrails plugin
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" );
Working with Collections
Getting all collections in the databaseSet<String> colls = db.getCollectionNames(); for (String s : colls) { System.out.println(s); }
Getting a single collectionDBCollection coll = db.getCollection("testCollection")
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);
BasicDBObjectBuilder
Utility for building objectsCan coerce Maps (and possibly JSON*) to DBObjects Example:
BasicDBObjectBuilder.start() .add( "name" , "eliot" ) .add( "number" , 17 ) .get();
Document Queries
DBObject myDoc = coll.findOne();// can also use BasicDBObject query = new BasicDBObject(); query.put("i", 71); DBCursor cur = coll.find(query);
GridFS
mechanism for storing files larger than 4MBfiles are chunked allowing fetching of a portion or out of orderchunking is mostly transparent to underlying operating systemcan store files in buckets, a MongoDB metaphor for foldersdefault is the fs bucket
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()}
Retrieving/Deleting a file
def retrieveFile(String filename) { return gridfs.findOne(filename)}
def deleteFile(String filename) { gridfs.remove(filename)}
Morphia
Apache 2 Licensedbrings Hibernate/JPA paradigms to MongoDBallows annotating of POJOs to make converting them between MongoDB and Java very easysupports DAO abstractionsoffers type-safe query supportcompatible with GWT, Guice, Spring, and DI frameworks
Morphia Annotations
@Id@Entity@Embedded@Reference@Indexed@Serialized@Property
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}
Mapping a POJO to a Mongo doc
Morphia morphia = ...;Mongo mongo = ...;DB db = mongo.getDB("contacts");
Contact contact = ...;
// map the contact to a DBObjectDBObject contactObj = morphia.toDBObject(contact);
db.getCollection("personal").save(contactObj);
Getting a POJO from a Mongo doc
Morphia morphia = ...;Mongo mongo = ...;DB db = mongo.getDB("contacts");
String contactId = ...;
//load the object from the collectionBasicDBObject idObj = new BasicDBObject( "_id", new ObjectId(contactId));BasicDBObject obj = (BasicDBObject) db.getCollection("personal").findOne(idObj);Contact contact = morphia.fromDBObject(Contact.class, obj);
DAOs
Encapsulate saving and retrieving objectsAuto-converts to and from POJOsCan provide constraints on searchesKey functions:
get(<mongoId>)find() or find(constraints)findOne(constraints)deleteById(<mongoId>)
DAO Example
import com.mongodb.Mongoimport com.google.code.morphia.*
class EntryDAO extends DAO<BlogEntry,String> { public EntryDAO(Morphia morphia, Mongo mongo) {super(mongo, morphia, "entries") }}
Constraints Examples
dao.find(new Constraints() .orderByDesc("dateCreated")).asList()
dao.find(new Constraints().field("dateCreated").greaterThanOrEqualTo(date).field("title").equalTo(params.title)).asList()
Beyond the Java Language
MongoDB with Groovy
Metaprogramming with MongoDB can reduce LOCDynamic findersFluent interface mirroring Ruby and Python
Groovy + MongoDB
JavaBasicDBObject doc = new BasicDBObject();doc.put("name", "MongoDB");doc.put("type", "database");doc.put("count", 1);coll.insert(doc);
Groovierdef doc = [name:"MongoDB",type:"database", count:1, info: [x:203, y:102] ] as BasicDBObjectcoll.insert(doc)
Grooviest (using groovy-mongo)coll.insert([name:"MongoDB", type:"database", info: [x:203, y:102]])
Dynamic Finders
can build complex queries at runtimecan even reach into objects for addition query parameters
Ex. collection.findByAuthorAndPostCreatedGreaterThan(...) collection.findByComments_CreatedOn(...)
How dynamic finders work
Groovy receives the request for the methodThe method is not found (invoking methodMissing)The method name used to construct a query templateThe method is cachedThe method is invoked with the parametersFuture invocations use the cached method
MongoDB Grails Plugin
Replaces JDBC layer in Grails applicationsCan use dynamic findersRequires only slight modifications to domain classeshttp://github.com/mpriatel/mongodb-grails
Links
Personal Blog: http://jameswilliams.be/blogTwitter: http://twitter.com/ecspike
Morphia: http://code.google.com/p/morphiaUtilities for Groovy: http://github.com/jwill/groovy-mongoMongoDB Grails plugin: http://github.com/mpriatel/mongodb-grails