To get started with GORM for Mongo you need to install the plugin into a Grails application:grails install-plugin mongodb
With that done you need to set up a running Mongodb server. Refer to the Mongodb Quick Start guide for an explanation on how to startup a Mongo instance. Once installed starting Mongo is typically a matter of executing the following command:With the above commands executed in a terminal window you should see output like the following appear:Thu Nov 11 16:54:08 MongoDB starting : pid=4600 port=27017 dbpath=/data/db/ 64-bit
Thu Nov 11 16:54:08 db version v1.6.3, pdfile version 4.5
Thu Nov 11 16:54:08 git version: 278bd2ac2f2efbee556f32c13c1b6803224d1c01
Thu Nov 11 16:54:08 sys info: Darwin erh2.10gen.cc 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386 i386 BOOST_LIB_VERSION=1_40
Thu Nov 11 16:54:08 [initandlisten] waiting for connections on port 27017
Thu Nov 11 16:54:08 [websvr] web admin interface listening on port 28017
As you can see the server is running on port 27017, but don't worry the Mongodb plugin for Grails will automatically configure itself to look for Mongodb on that port by default.If you want to configure how Grails connects to Mongo then you can do so using the following settings in grails-app/conf/DataSource.groovy
:grails {
mongo {
host = "localhost"
port = 27107
username = "blah"
password = "blah"
databaseName = "foo"
}
}
If you plan to use Mongo as your primary datastore then you need to uninstall the Hibernate plugin:grails uninstall-plugin hibernate
With this done all domain classes in grails-app/domain will be persisted via Mongo and not Hibernate. You can create a domain class by running the regular create-domain-class
command:grails create-domain-class Person
The Person
domain class will automatically be a persistent entity that can be stored in Mongo.If you have both the Hibernate and Mongo plugins installed then by default all classes in the grails-app/domain
directory will be persisted by Hibernate and not Mongo. If you want to persist a particular domain class with Mongo then you must use the mapWith
property in the domain class:Alternatively you can persist Hibernate entities to Mongo using the special mongo
scope added to all Hibernate entities:def hibernatePerson = Person.get(1)hibernatePerson.mongo.save()def mongoPerson = Person.mongo.get(1)
As mentioned the GORM for Mongo plugin will configure all the defaults for you, but if you wish to customize those defaults you can do so in the your grails-app/conf/DataSource.groovy
file:grails {
mongo {
host = "localhost"
port = 27107
username = "blah"
password = "blah"
databaseName = "foo"
}
}
The databaseName
setting configures the default database name. If not specified the databaseName
will default to the name of your application.You can also customize the Mongo connection settings using an options
block:grails {
mongo {
options {
autoConnectRetry = true
connectTimeout = 300
}
}
}
Available options and their descriptions are defined in the MongoOptions javadoc.In production scenarios you will typically use more than one Mongo server in either master/slave or replication scenarios. The plugin allows you to configure replica pairs:grails {
mongo {
replicaPair = [ "localhost:27017", "localhost:27018"]
}
}
Or replica sets:grails {
mongo {
replicaSet = [ "localhost:27017", "localhost:27018"]
}
}
The replica sets are defined using a list of strings that conform to the Mongo DBAddress specification.