java development with mongodb

25
Java Development with MongoDB James Williams Software Engineer, BT/Ribbit

Post on 18-Oct-2014

52.543 views

Category:

Technology


3 download

DESCRIPTION

Presented at MongoSF on April 30, 2010.

TRANSCRIPT

Page 1: Java development with MongoDB

Java Development with MongoDBJames Williams

Software Engineer, BT/Ribbit

Page 2: Java development with MongoDB

Agenda

Java Driver basicsMaking ConnectionsManaging CollectionsBasicDBObjectBuilderDocument QueriesGridFS

MorphiaBeyond the Java language

Groovy utilitiesGrails plugin

Page 3: Java development with MongoDB

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" );

Page 4: Java development with MongoDB

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")

Page 5: Java development with MongoDB

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);

Page 6: Java development with MongoDB

BasicDBObjectBuilder

Utility for building objectsCan coerce Maps (and possibly JSON*) to DBObjects Example:

BasicDBObjectBuilder.start() .add( "name" , "eliot" ) .add( "number" , 17 ) .get();

Page 7: Java development with MongoDB

Document Queries

DBObject myDoc = coll.findOne();// can also use BasicDBObject query = new BasicDBObject(); query.put("i", 71); DBCursor cur = coll.find(query);

Page 8: Java development with MongoDB

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

Page 9: Java development with MongoDB

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()}

Page 10: Java development with MongoDB

Retrieving/Deleting a file

def retrieveFile(String filename) { return gridfs.findOne(filename)}

def deleteFile(String filename) { gridfs.remove(filename)}

Page 11: Java development with MongoDB

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

Page 12: Java development with MongoDB

Morphia Annotations

@Id@Entity@Embedded@Reference@Indexed@Serialized@Property

Page 13: Java development with MongoDB

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}

Page 14: Java development with MongoDB

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);

Page 15: Java development with MongoDB

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);

Page 16: Java development with MongoDB

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>)

Page 17: Java development with MongoDB

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") }}

Page 18: Java development with MongoDB

Constraints Examples

dao.find(new Constraints() .orderByDesc("dateCreated")).asList()

dao.find(new Constraints().field("dateCreated").greaterThanOrEqualTo(date).field("title").equalTo(params.title)).asList()

Page 19: Java development with MongoDB

Beyond the Java Language

Page 20: Java development with MongoDB

MongoDB with Groovy

Metaprogramming with MongoDB can reduce LOCDynamic findersFluent interface mirroring Ruby and Python

Page 21: Java development with MongoDB

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]])

Page 22: Java development with MongoDB

Dynamic Finders

can build complex queries at runtimecan even reach into objects for addition query parameters

Ex. collection.findByAuthorAndPostCreatedGreaterThan(...) collection.findByComments_CreatedOn(...)

Page 23: Java development with MongoDB

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

Page 24: Java development with MongoDB

MongoDB Grails Plugin

Replaces JDBC layer in Grails applicationsCan use dynamic findersRequires only slight modifications to domain classeshttp://github.com/mpriatel/mongodb-grails

Page 25: Java development with MongoDB

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