# Mongoid
# Fields
As per the Mongoid Documentation (opens new window), there are 16 valid field types:
- Array
- BigDecimal
- Boolean
- Date
- DateTime
- Float
- Hash
- Integer
- BSON::ObjectId
- BSON::Binary
- Range
- Regexp
- String
- Symbol
- Time
- TimeWithZone
To add a field (let's call it name and have it be a String), add this to your model file:
field :name, type: String
To set a default value, just pass in the default option:
field :name, type: String, default: ""
# Installation
First, add Mongoid to your Gemfile:
gem "mongoid", "~> 4.0.0"
and then run bundle install. Or just run:
$ gem install mongoid
After installation, run the generator to create the config file:
$ rails g mongoid:config
which will create the file (myapp)/config/mongoid.yml.
# Creating a Model
Create a model (lets call it User) by running:
$ rails g model User
which will generate the file app/models/user.rb:
class User
include Mongoid::Document
end
This is all you need to have a model (albeit nothing but an id field). Unlike ActiveRecord, there is no migration files. All the database information for the model is contained in the model file.
Timestamps are not automatically included in your model when you generate it. To add created_at and updated_at to your model, add
include Mongoid::Timestamps
to your model underneath include Mongoid::Document like so:
class User
include Mongoid::Document
include Mongoid::Timestamps
end
# Classic Associations
Mongoid allows the classic ActiveRecord associations:
- One-to-one:
has_one/belongs_to - One-to-many:
has_many/belongs_to - Many-to-many:
has_and_belongs_to_many
To add an association (lets say the User has_many posts), you can add this to your User model file:
has_many :posts
and this to your Post model file:
belongs_to :user
This will add a user_id field in your Post model, add a user method to your Post class, and add a posts method to your User class.
# Embedded Associations
Mongoid allows Embedded Associations:
- One-to-one:
embeds_one/embedded_in - One-to-many:
embeds_many/embedded_in
To add an association (lets say the User embeds_many addresses), add this to your User file:
embeds_many :addresses
and this to your Address model file:
embedded_in :user
This will embed Address in your User model, adding a addresses method to your User class.
# Database Calls
Mongoid tries to have similar syntax to ActiveRecord when it can. It supports these calls (and many more)
User.first #Gets first user from the database
User.count #Gets the count of all users from the database
User.find(params[:id]) #Returns the user with the id found in params[:id]
User.where(name: "Bob") #Returns a Mongoid::Criteria object that can be chained
#with other queries (like another 'where' or an 'any_in')
#Does NOT return any objects from database
User.where(name: "Bob").entries #Returns all objects with name "Bob" from database
User.where(:name.in => ['Bob', 'Alice']).entries #Returns all objects with name "Bob" or "Alice" from database
User.any_in(name: ["Bob", "Joe"]).first #Returns the first object with name "Bob" or "Joe"
User.where(:name => 'Bob').exists? # will return true if there is one or more users with name bob