Mongodb Rails
Bài đăng này đã không được cập nhật trong 7 năm
Giới thiệu
MongoDB là một documented oriented database hay gọi đơn giản là một dạng NoSQL. Nó có nhiều điểm khác biệt so với hệ cơ sở dữ liệu quan hệ truyền thống như SQL. Với MogoDB, cấu trúc của cơ sở dữ liệu là động và có thể tùy biến thay đổi dễ dàng tùy thuộc vào kiểu dữ liệu lưu trữ. Nó khác hoàn toàn với MySQL, với MySQL ta phải định nghĩa sẵn cấu trúc dữ liệu cho các bảng còn với NoSQL thì ta không cần thiết phải làm việc này. Việc này làm cho việc mở rộng cơ sở dữ liệu một cách linh hoạt và dễ thay đổi. Hơn nữa với NoSQL bạn có thể dễ dàng thao tác với một lượng cơ sở dữ liệu lớn, tốc độ truy xuất được cải thiện rất nhiều so với SQL.
Cài đặt MongoDB (Ubuntu)
sudo apt-get install mongodb
Kiểm tra
$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use test
> db.test.insert({'name': 'Test Name'})
> db.test.find()
Để kiểm tra ta gõ lệnh mongo
, trên đây tôi đã thử với việc thêm một bản ghi dữ liệu mới vào và tìm kiếm thử trên MongoDB. Mặc định mongodb sẽ chạy ở cổng 27017.
Như vậy ta đã xong bước cài đặt MongoDB trên máy, cũng khá là đơn giản. Tiếp theo tôi sẽ tiếp tục với việc sử dụng MongoDB với Rails
MongoDB với Rails
Để sử dụng MongoDB với Rails một cách thuận tiện tôi khuyên bạn nên dùng gem mongoid
, gem này hỗ trợ rất tốt và được cộng đồng đông đảo người dùng.
Thêm vào Gemfile
gem 'mongoid'
Tiếp đó bạn chạy bundle install
để cài đặt gem này vào hệ thống và chạy lệnh rails g mongoid:config
để tạo ra file cấu hình cho mongoid
bunlde install
rails g mongoid:config
Sau khi chạy lệnh này ta sẽ thấy một file mới được thêm vào là config/mongoid.yml
có đầy đủ các config mặc định của mongoid. Bạn có thể tùy chỉnh cấu hình tùy ý trên file này.
development:
# Configure available database clients. (required)
clients:
# Defines the default client. (required)
default:
# Defines the name of the default database that Mongoid can connect to.
# (required).
database: mongodemo_development
# Provides the hosts the default client can connect to. Must be an array
# of host:port pairs. (required)
hosts:
- localhost:27017
options:
# Change the default write concern. (default = { w: 1 })
# write:
# w: 1
# Change the default read preference. Valid options for mode are: :secondary,
# :secondary_preferred, :primary, :primary_preferred, :nearest
# (default: primary)
# read:
# mode: :secondary_preferred
# tag_sets:
# - use: web
# The name of the user for authentication.
# user: 'user'
# The password of the user for authentication.
# password: 'password'
# The user's database roles.
# roles:
# - 'dbOwner'
# Change the default authentication mechanism. Valid options are: :scram,
# :mongodb_cr, :mongodb_x509, and :plain. Note that all authentication
# mechanisms require username and password, with the exception of :mongodb_x509.
# Default on mongoDB 3.0 is :scram, default on 2.4 and 2.6 is :plain.
# auth_mech: :scram
# The database or source to authenticate the user against.
# (default: the database specified above or admin)
# auth_source: admin
# Force a the driver cluster to behave in a certain manner instead of auto-
# discovering. Can be one of: :direct, :replica_set, :sharded. Set to :direct
# when connecting to hidden members of a replica set.
# connect: :direct
# Changes the default time in seconds the server monitors refresh their status
# via ismaster commands. (default: 10)
# heartbeat_frequency: 10
# The time in seconds for selecting servers for a near read preference. (default: 0.015)
# local_threshold: 0.015
# The timeout in seconds for selecting a server for an operation. (default: 30)
# server_selection_timeout: 30
# The maximum number of connections in the connection pool. (default: 5)
# max_pool_size: 5
# The minimum number of connections in the connection pool. (default: 1)
# min_pool_size: 1
# The time to wait, in seconds, in the connection pool for a connection
# to be checked in before timing out. (default: 5)
# wait_queue_timeout: 5
# The time to wait to establish a connection before timing out, in seconds.
# (default: 5)
# connect_timeout: 5
# The timeout to wait to execute operations on a socket before raising an error.
# (default: 5)
# socket_timeout: 5
# The name of the replica set to connect to. Servers provided as seeds that do
# not belong to this replica set will be ignored.
# replica_set: name
# Whether to connect to the servers via ssl. (default: false)
# ssl: true
# The certificate file used to identify the connection against MongoDB.
# ssl_cert: /path/to/my.cert
# The private keyfile used to identify the connection against MongoDB.
# Note that even if the key is stored in the same file as the certificate,
# both need to be explicitly specified.
# ssl_key: /path/to/my.key
# A passphrase for the private key.
# ssl_key_pass_phrase: password
# Whether or not to do peer certification validation. (default: true)
# ssl_verify: true
# The file containing a set of concatenated certification authority certifications
# used to validate certs passed from the other end of the connection.
# ssl_ca_cert: /path/to/ca.cert
# Configure Mongoid specific options. (optional)
options:
# Includes the root model name in json serialization. (default: false)
# include_root_in_json: false
# Include the _type field in serialization. (default: false)
# include_type_for_serialization: false
# Preload all models in development, needed when models use
# inheritance. (default: false)
# preload_models: false
# Raise an error when performing a #find and the document is not found.
# (default: true)
# raise_not_found_error: true
# Raise an error when defining a scope with the same name as an
# existing method. (default: false)
# scope_overwrite_exception: false
# Raise an error when defining a field with the same name as an
# existing method. (default: false)
# duplicate_fields_exception: false
# Use Active Support's time zone in conversions. (default: true)
# use_activesupport_time_zone: true
# Ensure all times are UTC in the app side. (default: false)
# use_utc: false
# Set the Mongoid and Ruby driver log levels when not in a Rails
# environment. The Mongoid logger will be set to the Rails logger
# otherwise.(default: :info)
# log_level: :info
# Control whether `belongs_to` association is required. By default
# `belongs_to` will trigger a validation error if the association
# is not present. (default: true)
# belongs_to_required_by_default: true
# Application name that is printed to the mongodb logs upon establishing a
# connection in server versions >= 3.4. Note that the name cannot exceed 128 bytes.
# app_name: MyApplicationName
test:
clients:
default:
database: mongodemo_test
hosts:
- localhost:27017
options:
read:
mode: :primary
max_pool_size: 1
Tiếp theo ta sẽ thử thao tác CRUD (tạo, sửa, xem, xóa) với model Person. Ta sẽ dùng lệnh sinh code tự động cho đơn giản
rails g scaffold Person first_name last_name email notes
Sau khi chạy lệnh này rails sẽ sinh ra code cơ bản đầy đủ cho phép ta thao tác với model Person.
Ta có 1 model mới với nội dung như sau
class Person
include Mongoid::Document
field :first_name, type: String
field :last_name, type: String
field :email, type: String
field :notes, type: String
end
Bạn chú ý là những lệnh generate tương đối giống với việc sử dụng cơ sở dữ liệu sql chỉ khác chỗ bạn không cần khai báo kiểu dữ liệu với các thuộc tính. Thêm nữa là bạn cũng không cần chạy lệnh migrate
bởi vì mongodb không có cấu trúc dữ liệu cố định nên cũng không cần chạy migrate để cập nhật lại cấu trúc dữ liệu (schema).
Bạn có thể kiểm tra bằng việc chạy thử server local
http://localhost:3000/people
Như vậy ta đã hoàn thành một app đơn giản với mongodb + Rails.
Bạn có thể tham khảo thêm tài liệu việc sử dụng mongoid ở đây Tài liệu
Sử dụng mongodb với heroku
Để sử dụng mongodb với heroku bạn cần thêm một add-on là mLab MongoDB. Sau khi thêm add on này vào app của, bạn sẽ có được thông tin về tài khoản đăng nhập vào cơ sở dữ liệu mongodb này khi xem thông tin của add on mLab MongoDB :: Mongodb
. Ở chế độ free mLab MongoDB cho bạn sử dụng gần 500M dữ liệu, ta thấy nó lớn hơn rất nhiêu so với chế độ free của posgres trên heroku với 10,000 bản ghi.
Bạn có thể sửa lại file config/mongoid.yml
để cấu hình lại database cho môi trường production. Dưới dây tôi sẽ lấy ví dụ
production:
clients:
default:
database: <%= ENV[DB_NAME] %>
hosts:
- <%= ENV[HOST] %>
options:
user: <%= ENV[USER] %>
password: <%= ENV[PASSWORD] %>
Chú ý: ENV[HOST] bao gồm cả port ví dụ: example.com:3442
Như vậy bạn có thể sử dụng mogodb với Rails một cách dễ dàng và có thể deploy thử trên heroku app tương tự với pg.
Cảm ơn bạn đã theo dõi bài viết !
All rights reserved