java development with mongodb

Post on 18-Oct-2014

52.543 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

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

top related