EmeraldODM

EmeraldODM is an Object-Document Mapper (ODM) for Ruby that allows you to interact with MongoDB databases in a simple, Ruby-like way. It provides a high-level, easy-to-use interface for working with MongoDB documents, while abstracting away the low-level details of the MongoDB driver.

The main objective of this gem is primarily to facilitate reading data from a MongoDB database.

Installation

To install EmeraldODM, simply add it to your Gemfile:

gem 'emerald_odm'

Then run bundle install to install the gem and its dependencies.

Usage

Here's a quick example of how to use EmeraldODM to interact with a MongoDB database:

1. Setup DB connection

require 'emerald_odm'

# Connect to the MongoDB servers before using EmeraldODM
EmeraldODM.databases_settings.merge!(
  {
    blog: [
      [ '192.168.0.1:27017', '192.168.1.1:27017'],
      {
        database: 'blog',
        user: ENV['MONGO_LOGIN'],
        password: ENV['MONGO_PASSWD'],
        auth_source:  ENV['auth_source'],
        max_pool_size: 20,
      }
    ],
    ecommerce: [
      [ '193.168.0.1:27017', '193.168.1.1:27017'],
      {
        database: 'ecommerce',
        user: ENV['MONGO_LOGIN'],
        password: ENV['MONGO_PASSWD'],
        auth_source:  ENV['auth_source'],
        max_pool_size: 20,
      }
    ],
  }
)

2. Define your model

require 'emerald_odm'
# Define a model for the "users" collection
class User < EmeraldODM::Collection

  attr_accessor :_id, :name, :email, :posts, :keywords_count

  def self.collection_name
    :users
  end

  def self.db_name
    :blog
  end

  def self.posts=(posts)
    @posts = posts.map { |post| Post.new(post)}
  end

  class Post < EmeraldODM::AttrInitializer
    attr_accessor :id, :title, :body, :created_at, :updated_at

    def created_at
      Time.parse(@created_at)
    end

    def updated_at
      Time.parse(@updated_at)
    end

    def keywords
      body.scan(/\w+/)
    end
  end

end

3. Use it

# Find users using a query
users = User.find(
  {name: 'John Doe'}, # filter query is required
  projection: {name: 1, email: 1, posts: 1, keywords_count: 1}, # optional, the default is to return all fields defined in the model
  limit: 10, # optional, the default is to return all documents
  sort: {name: 1} # optional
)

# users is an array of User objects like Array<User>
users.each do |user|
  posts = user.posts
  all_user_keywords = posts.map(&:keywords).flatten.uniq
  User.update_one(
    {_id: user._id},
    set: {keywords_count: all_user_keywords.count}
  )
end

Advanced usage

EmeraldODM supports advanced usage such as:

Accessing the underlying MongoDB driver

User.collection # returns the underlying MongoDB::Collection object

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/MikaelSantilio/emerald-odm/.

License

The gem is available as open source under the terms of the MIT License.