SlideShare a Scribd company logo
Java Development with MongoDB James Williams Software Engineer, BT/Ribbit
Agenda Java Driver basics Making Connections Managing Collections BasicDBObjectBuilder Document Queries GridFS Morphia Beyond the Java language Groovy utilities Grails 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 database Set<String> colls = db.getCollectionNames();  for (String s : colls) {     System.out.println(s);  } Getting a single collection DBCollection coll = db.getCollection(&quot;testCollection&quot;)
Inserting Documents BasicDBObject doc = new BasicDBObject();  doc.put(&quot;name&quot;, &quot;MongoDB&quot;);  doc.put(&quot;type&quot;, &quot;database&quot;);  doc.put(&quot;count&quot;, 1);  BasicDBObject info = new BasicDBObject();  info.put(&quot;x&quot;, 203);  info.put(&quot;y&quot;, 102);  doc.put(&quot;info&quot;, info);  coll.insert(doc);
BasicDBObjectBuilder Utility for building objects Can coerce Maps (and possibly JSON*) to DBObjects   Example: BasicDBObjectBuilder.start()      .add( &quot;name&quot; , &quot;eliot&quot; )      .add( &quot;number&quot; , 17 )      .get();
Document Queries DBObject myDoc = coll.findOne(); // can also use BasicDBObjectBuilderBasicDBObject query = new BasicDBObject(); query.put(&quot;i&quot;, 71); Cursor cur = coll.find(query);
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
Saving a file to GridFS def mongo = new Mongo(host) def gridfs = new GridFS(mongo.getDB(&quot;db&quot;)) 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 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
Creating a Morphia POJO import com.google.code.morphia.annotations.Entity; @Entity(&quot;collectionName&quot;) 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(&quot;contacts&quot;); Contact contact = ...; // map the contact to a DBObject DBObject contactObj = morphia.toDBObject(contact); db.getCollection(&quot;personal&quot;).save(contactObj);
Getting a POJO from a Mongo doc Morphia morphia = ...; Mongo mongo = ...; DB db = mongo.getDB(&quot;contacts&quot;); String contactId = ...; //load the object from the collection BasicDBObject idObj = new BasicDBObject(      &quot;_id&quot;, new ObjectId(contactId) ); BasicDBObject obj = (BasicDBObject)    db.getCollection(&quot;personal&quot;).findOne(idObj); Contact contact = morphia.fromDBObject(Contact.class, obj);
Beyond the Java Language
MongoDB with Groovy Metaprogramming with MongoDB can reduce LOC Dynamic finders Fluent interface mirroring Ruby and Python
Groovy + MongoDB J ava BasicDBObject doc = new BasicDBObject(); doc.put(&quot;name&quot;, &quot;MongoDB&quot;); doc.put(&quot;type&quot;, &quot;database&quot;); doc.put(&quot;count&quot;, 1); coll.insert(doc); Groovier def doc = [name:&quot;MongoDB&quot;,type:&quot;database&quot;, count:1, info:      [x:203, y:102] ] as BasicDBObject coll.insert(doc) Grooviest (using groovy-mongo) coll.insert([name:&quot;MongoDB&quot;, type:&quot;database&quot;, info: [x:203, y:102]])
Dynamic Finders can build complex queries at runtime can even reach into objects for addition query parameters Ex.  collection.findByAuthorAndPostCreatedGreaterThan(...)      collection.findByComments_CreatedOn(...)  
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
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
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

More Related Content

PPT
Using MongoDB With Groovy
James Williams
 
ODP
Python and MongoDB
Christiano Anderson
 
PDF
Python and MongoDB
Norberto Leite
 
PDF
The emerging world of mongo db csp
Carlos Sánchez Pérez
 
PDF
MongoDB and Python
Norberto Leite
 
PPTX
Webinar: Building Your First App
MongoDB
 
PPT
A Brief MongoDB Intro
Scott Hernandez
 
PPT
Mongo-Drupal
Forest Mars
 
Using MongoDB With Groovy
James Williams
 
Python and MongoDB
Christiano Anderson
 
Python and MongoDB
Norberto Leite
 
The emerging world of mongo db csp
Carlos Sánchez Pérez
 
MongoDB and Python
Norberto Leite
 
Webinar: Building Your First App
MongoDB
 
A Brief MongoDB Intro
Scott Hernandez
 
Mongo-Drupal
Forest Mars
 

What's hot (20)

PPTX
Java Development with MongoDB
Scott Hernandez
 
PDF
Building a Gigaword Corpus (PyCon 2017)
Rebecca Bilbro
 
PPTX
Back to Basics: My First MongoDB Application
MongoDB
 
PDF
Data Intelligence 2017 - Building a Gigaword Corpus
Rebecca Bilbro
 
PDF
PyConIT6 - MAKING SESSIONS AND CACHING ROOMMATES
Alessandro Molina
 
PPTX
IPTC News in JSON AGM 2013
Stuart Myles
 
PDF
Superficial mongo db
DaeMyung Kang
 
PPT
TopDB data transfer
Chonpin HSU
 
KEY
C# Development (Sam Corder)
MongoSF
 
PDF
PyConIT6 - Messing up with pymongo for fun and profit
Alessandro Molina
 
ODP
MongoDB - javascript for your data
aaronheckmann
 
PDF
Latinoware
kchodorow
 
PPT
MongoDB
kesavan N B
 
PPTX
Simple MongoDB design for Rails apps
Sérgio Santos
 
PPT
Meetup#1: 10 reasons to fall in love with MongoDB
Minsk MongoDB User Group
 
PDF
How do i Meet MongoDB
Antonio Scalzo
 
ODP
A Year With MongoDB: The Tips
Rizky Abdilah
 
KEY
MongoDB Java Development - MongoBoston 2010
Eliot Horowitz
 
PPTX
Mongo db queries
ssuser6d5faa
 
PDF
Inside MongoDB: the Internals of an Open-Source Database
Mike Dirolf
 
Java Development with MongoDB
Scott Hernandez
 
Building a Gigaword Corpus (PyCon 2017)
Rebecca Bilbro
 
Back to Basics: My First MongoDB Application
MongoDB
 
Data Intelligence 2017 - Building a Gigaword Corpus
Rebecca Bilbro
 
PyConIT6 - MAKING SESSIONS AND CACHING ROOMMATES
Alessandro Molina
 
IPTC News in JSON AGM 2013
Stuart Myles
 
Superficial mongo db
DaeMyung Kang
 
TopDB data transfer
Chonpin HSU
 
C# Development (Sam Corder)
MongoSF
 
PyConIT6 - Messing up with pymongo for fun and profit
Alessandro Molina
 
MongoDB - javascript for your data
aaronheckmann
 
Latinoware
kchodorow
 
MongoDB
kesavan N B
 
Simple MongoDB design for Rails apps
Sérgio Santos
 
Meetup#1: 10 reasons to fall in love with MongoDB
Minsk MongoDB User Group
 
How do i Meet MongoDB
Antonio Scalzo
 
A Year With MongoDB: The Tips
Rizky Abdilah
 
MongoDB Java Development - MongoBoston 2010
Eliot Horowitz
 
Mongo db queries
ssuser6d5faa
 
Inside MongoDB: the Internals of an Open-Source Database
Mike Dirolf
 
Ad

Similar to Java Development with MongoDB (James Williams) (20)

PDF
Java development with MongoDB
James Williams
 
PPTX
MongoDB Aug2010 SF Meetup
Scott Hernandez
 
PPTX
Mongo sf easy java persistence
Scott Hernandez
 
PPTX
MongoDB: Easy Java Persistence with Morphia
Scott Hernandez
 
PDF
What do you mean, Backwards Compatibility?
Trisha Gee
 
PPTX
MongoDB using Grails plugin by puneet behl
TO THE NEW | Technology
 
PPTX
Spring Data, Jongo & Co.
Tobias Trelle
 
PPT
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
JAX London
 
PPTX
Java Persistence Frameworks for MongoDB
Tobias Trelle
 
PPTX
MongoDB + Spring
Norberto Leite
 
PPTX
MongoDB and Spring - Two leaves of a same tree
MongoDB
 
PPTX
Morphia, Spring Data & Co.
Tobias Trelle
 
PPTX
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
Tobias Trelle
 
PDF
Dev Jumpstart: Build Your First App with MongoDB
MongoDB
 
PPTX
MongoDB + Java - Everything you need to know
Norberto Leite
 
PPTX
Mongo+java (1)
MongoDB
 
PDF
Strongly Typed Languages and Flexible Schemas
Norberto Leite
 
PDF
Webinar: Building Your First App with MongoDB and Java
MongoDB
 
PPTX
Webinar: Strongly Typed Languages and Flexible Schemas
MongoDB
 
PDF
Hands On Spring Data
Eric Bottard
 
Java development with MongoDB
James Williams
 
MongoDB Aug2010 SF Meetup
Scott Hernandez
 
Mongo sf easy java persistence
Scott Hernandez
 
MongoDB: Easy Java Persistence with Morphia
Scott Hernandez
 
What do you mean, Backwards Compatibility?
Trisha Gee
 
MongoDB using Grails plugin by puneet behl
TO THE NEW | Technology
 
Spring Data, Jongo & Co.
Tobias Trelle
 
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
JAX London
 
Java Persistence Frameworks for MongoDB
Tobias Trelle
 
MongoDB + Spring
Norberto Leite
 
MongoDB and Spring - Two leaves of a same tree
MongoDB
 
Morphia, Spring Data & Co.
Tobias Trelle
 
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
Tobias Trelle
 
Dev Jumpstart: Build Your First App with MongoDB
MongoDB
 
MongoDB + Java - Everything you need to know
Norberto Leite
 
Mongo+java (1)
MongoDB
 
Strongly Typed Languages and Flexible Schemas
Norberto Leite
 
Webinar: Building Your First App with MongoDB and Java
MongoDB
 
Webinar: Strongly Typed Languages and Flexible Schemas
MongoDB
 
Hands On Spring Data
Eric Bottard
 
Ad

More from MongoSF (19)

PPTX
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
MongoSF
 
PPTX
Schema design with MongoDB (Dwight Merriman)
MongoSF
 
KEY
Flexible Event Tracking (Paul Gebheim)
MongoSF
 
KEY
Administration (Eliot Horowitz)
MongoSF
 
PDF
Ruby Development and MongoMapper (John Nunemaker)
MongoSF
 
PDF
MongoHQ (Jason McCay & Ben Wyrosdick)
MongoSF
 
KEY
Administration
MongoSF
 
KEY
Sharding with MongoDB (Eliot Horowitz)
MongoSF
 
KEY
Practical Ruby Projects (Alex Sharp)
MongoSF
 
PDF
Implementing MongoDB at Shutterfly (Kenny Gorman)
MongoSF
 
PDF
Debugging Ruby (Aman Gupta)
MongoSF
 
PPTX
Indexing and Query Optimizer (Aaron Staple)
MongoSF
 
PPTX
MongoDB Replication (Dwight Merriman)
MongoSF
 
PDF
Zero to Mongo in 60 Hours
MongoSF
 
KEY
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
MongoSF
 
KEY
PHP Development with MongoDB (Fitz Agard)
MongoSF
 
PPTX
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
MongoSF
 
PPTX
From MySQL to MongoDB at Wordnik (Tony Tam)
MongoSF
 
PDF
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
MongoSF
 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
MongoSF
 
Schema design with MongoDB (Dwight Merriman)
MongoSF
 
Flexible Event Tracking (Paul Gebheim)
MongoSF
 
Administration (Eliot Horowitz)
MongoSF
 
Ruby Development and MongoMapper (John Nunemaker)
MongoSF
 
MongoHQ (Jason McCay & Ben Wyrosdick)
MongoSF
 
Administration
MongoSF
 
Sharding with MongoDB (Eliot Horowitz)
MongoSF
 
Practical Ruby Projects (Alex Sharp)
MongoSF
 
Implementing MongoDB at Shutterfly (Kenny Gorman)
MongoSF
 
Debugging Ruby (Aman Gupta)
MongoSF
 
Indexing and Query Optimizer (Aaron Staple)
MongoSF
 
MongoDB Replication (Dwight Merriman)
MongoSF
 
Zero to Mongo in 60 Hours
MongoSF
 
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
MongoSF
 
PHP Development with MongoDB (Fitz Agard)
MongoSF
 
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
MongoSF
 
From MySQL to MongoDB at Wordnik (Tony Tam)
MongoSF
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
MongoSF
 

Recently uploaded (20)

PDF
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
PDF
This slide provides an overview Technology
mineshkharadi333
 
PDF
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
PDF
Chapter 1 Introduction to CV and IP Lecture Note.pdf
Getnet Tigabie Askale -(GM)
 
PDF
The Evolution of KM Roles (Presented at Knowledge Summit Dublin 2025)
Enterprise Knowledge
 
PDF
A Day in the Life of Location Data - Turning Where into How.pdf
Precisely
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Francisco Vieira Júnior
 
PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PPTX
How to Build a Scalable Micro-Investing Platform in 2025 - A Founder’s Guide ...
Third Rock Techkno
 
PPTX
ChatGPT's Deck on The Enduring Legacy of Fax Machines
Greg Swan
 
PDF
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
PDF
Event Presentation Google Cloud Next Extended 2025
minhtrietgect
 
PDF
Best ERP System for Manufacturing in India | Elite Mindz
Elite Mindz
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PPT
Coupa-Kickoff-Meeting-Template presentai
annapureddyn
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
PDF
Software Development Company | KodekX
KodekX
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
This slide provides an overview Technology
mineshkharadi333
 
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
Chapter 1 Introduction to CV and IP Lecture Note.pdf
Getnet Tigabie Askale -(GM)
 
The Evolution of KM Roles (Presented at Knowledge Summit Dublin 2025)
Enterprise Knowledge
 
A Day in the Life of Location Data - Turning Where into How.pdf
Precisely
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Francisco Vieira Júnior
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
How to Build a Scalable Micro-Investing Platform in 2025 - A Founder’s Guide ...
Third Rock Techkno
 
ChatGPT's Deck on The Enduring Legacy of Fax Machines
Greg Swan
 
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
Event Presentation Google Cloud Next Extended 2025
minhtrietgect
 
Best ERP System for Manufacturing in India | Elite Mindz
Elite Mindz
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Coupa-Kickoff-Meeting-Template presentai
annapureddyn
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
Software Development Company | KodekX
KodekX
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 

Java Development with MongoDB (James Williams)

  • 1. Java Development with MongoDB James Williams Software Engineer, BT/Ribbit
  • 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( &quot;localhost&quot; );  Mongo m = new Mongo( &quot;localhost&quot; , 27017 );  DB db = m.getDB( &quot;mydb&quot; );
  • 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(&quot;testCollection&quot;)
  • 5. Inserting Documents BasicDBObject doc = new BasicDBObject(); doc.put(&quot;name&quot;, &quot;MongoDB&quot;); doc.put(&quot;type&quot;, &quot;database&quot;); doc.put(&quot;count&quot;, 1); BasicDBObject info = new BasicDBObject(); info.put(&quot;x&quot;, 203); info.put(&quot;y&quot;, 102); doc.put(&quot;info&quot;, info); coll.insert(doc);
  • 6. BasicDBObjectBuilder Utility for building objects Can coerce Maps (and possibly JSON*) to DBObjects   Example: BasicDBObjectBuilder.start()      .add( &quot;name&quot; , &quot;eliot&quot; )      .add( &quot;number&quot; , 17 )      .get();
  • 7. Document Queries DBObject myDoc = coll.findOne(); // can also use BasicDBObjectBuilderBasicDBObject query = new BasicDBObject(); query.put(&quot;i&quot;, 71); Cursor 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(&quot;db&quot;)) def save(inputStream, contentType, filename) {      def inputFile = gridfs.createFile(inputStream)      inputFile.setContentType(contentType)      inputFile.setFilename(filename)      inputFile.save() }
  • 10. Retrieving/Deleting a file def retrieveFile(String filename) {      return gridfs.findOne(filename) } def deleteFile(String filename) {      gridfs.remove(filename) }
  • 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
  • 12. Creating a Morphia POJO import com.google.code.morphia.annotations.Entity; @Entity(&quot;collectionName&quot;) public class Contact {      @Id      private String id;    //generated by MongoDB      private String firstName;      private String lastName;      @Embedded      private List<PhoneNumber> phoneNumbers;      // getters and setters }
  • 13. Mapping a POJO to a Mongo doc Morphia morphia = ...; Mongo mongo = ...; DB db = mongo.getDB(&quot;contacts&quot;); Contact contact = ...; // map the contact to a DBObject DBObject contactObj = morphia.toDBObject(contact); db.getCollection(&quot;personal&quot;).save(contactObj);
  • 14. Getting a POJO from a Mongo doc Morphia morphia = ...; Mongo mongo = ...; DB db = mongo.getDB(&quot;contacts&quot;); String contactId = ...; //load the object from the collection BasicDBObject idObj = new BasicDBObject(      &quot;_id&quot;, new ObjectId(contactId) ); BasicDBObject obj = (BasicDBObject)    db.getCollection(&quot;personal&quot;).findOne(idObj); Contact contact = morphia.fromDBObject(Contact.class, obj);
  • 15. Beyond the Java Language
  • 16. MongoDB with Groovy Metaprogramming with MongoDB can reduce LOC Dynamic finders Fluent interface mirroring Ruby and Python
  • 17. Groovy + MongoDB J ava BasicDBObject doc = new BasicDBObject(); doc.put(&quot;name&quot;, &quot;MongoDB&quot;); doc.put(&quot;type&quot;, &quot;database&quot;); doc.put(&quot;count&quot;, 1); coll.insert(doc); Groovier def doc = [name:&quot;MongoDB&quot;,type:&quot;database&quot;, count:1, info:      [x:203, y:102] ] as BasicDBObject coll.insert(doc) Grooviest (using groovy-mongo) coll.insert([name:&quot;MongoDB&quot;, type:&quot;database&quot;, info: [x:203, y:102]])
  • 18. Dynamic Finders can build complex queries at runtime can even reach into objects for addition query parameters Ex.  collection.findByAuthorAndPostCreatedGreaterThan(...)      collection.findByComments_CreatedOn(...)  
  • 19. 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
  • 20. 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
  • 21. 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