Sử dụng MONGODB và MONGOID trong Rails

Chao,

Đến tháng lại lên, hôm nay mình lại bắt đầu một chia sẻ mới, về một chủ đề không mới nhưng vẫn ít được áp dụng trong giới RoR coding của chúng ta hiện nay 😄 😄

Sử dụng MongoDB trong ứng dụng Rails

Mở bài

Những năm gần đây, các ứng dụng lớn với quy mô data lớn xuất hiện ngày một nhiều. Điều đó đặt ra một vấn đề cho các lập trình viên về tính hiệu quả và sức chưa của các cơ sở dữ liệu được thiết kế. Đó cũng là lý do mà Big data và MongoDB ra đời

Thân bài

1. Giới thiệu qua về MongoDB

MongoDB được MongoLab phát triển bởi code C++, sử dụng syntax làm việc theo kiểu javascript.

Nó là CSDL dữ liệu phục vụ cho lưu trữ bigdata nên tốc độ đọc ghi cực kỳ nhanh và hiệu quả với việc lưu trữ dữ liệu bán cấu trúc và phi cấu trúc.

Hiện nay version mới nhất của MongoDB là 3.2, các bạn có thể cài đặt mongodb tại địa chỉ sau:

https://www.mongodb.com/download-center?jmp=docs

Sau khi cài đặt xong MongoDB trong ứng dụng, chúng ta có thể sử dụng chúng

Note: Chúng ta sử dụng MongoDB trong ứng dụng Rails thông qua một data mapper là MongoId. Hiện tại, MongoId đã chính thức được phát triển bởi MongoDB.

Các bạn có thể hình dung một cách đơn giản hơn về MongoId là nó sẽ hổ trợ chức năng thao tác với DB trong rails app y như cách thằng ActiveRecord hổ trợ để tương tác với MySQL

2. Cài đặt MongoDB trong Rails app

Đối với Rails app, nó "y dì" như thể bạn ăn cơm vậy thôi 😄

  • Add gemfile: gem 'mongoid', '~> 6.1.0' và chạy bundle

  • Tạo file config(giống như file database.yml)

rails g mongoid:config

Khi đó, ứng dụng sẽ sinh ra cho bạn một file để config mapping với Mongo là mongoid.yml trong folder config.

Sau khi install và và config thì mọi chuyện lại trở về bình thường với việc tạo data và sự dụng chúng

  • Nếu bạn muốn tạo model, chúng ta sử dụng lệnh:
rails g model MODELNAME

Khi đó ta sẽ được một model có dạng như sau:

class ModelName
  include Mongoid::Document
  # Store in collections name
  store_in collection: 'abcs'
  #Field
  field :word, type: String, default: ""
  field :wordtype, type: String
  field :definition, type: String
  scope :search, ->(key){ any_of({ :word => /^#{key}/i }) }
  
end

Chúng ta cùng phân tích cấu trúc của file trên một chút

Đầu tiên là các include phổ biến trong MongoDB

include Mongoid::Document

Sử dụng Class với các tính chất là Document.

Để tận dung tốt khả năng lưu trữ dữ liệu bán cấu trúc và phi cấu trúc, 1 mo dun khá lợi hại đó là:

include Mongoid::Attributes::Dynamic

Nếu bình thường dữ liệu sẽ được lưu trữ ở collection có tên là modelnames (dạng số nhiều) tương tự như ActiveRecord (AR) thôi.

Từ khóa Field dùng để chỉ đến các trường bạn sẽ lưu dữ liệu, cái này nó giống như các cột trong AR thôi mà 😃).

Nhưng MongoDB-mình viết tắt nó là Mông nhé, mỏi tay quá 😄 😄, Mông nó có một điểm đặc biệt mà mình rất thích là bạn không cần phải migrate file như bình thường mình vẫn hay làm với Rails app và AR. Điều này cải thiện một cách đáng kể tính nhanh chóng tiện lợi và đỡ nhàm chán hơn cho dev rất nhiều 😃)

Điều này cũng có nghĩa là khi sử dụng Mông, dự án sẽ được tăng tốc độ lên rất cao và cải thiện đáng kể hiệu năng làm việc của anh em

Id mặc định của các Model theo Mongoid là ObjectId (BSON) có dạng như sau:

<span class="nx">_id</span><span class="o">:</span> <span class="nx">ObjectId</span><span class="p">(</span><span class="s2">"509a8fb2f3f4948bd2f983a0"</span><span class="p">)</span>

Không giống với AR, tuy nhiên id này được mongodb mặc định sinh ra và hoàn toàn tự động, không bao giờ trùng lắp.

Trong AR, các quan hệ được khai báo khá dễ dàng thì mongoid cũng vậy.

Embeds One
Embeds Many
Has One
Has Many
Belongs To
Has And Belongs To Many
The counter_cache

Các bạn có thể tham khảo một số tài liệu về cách hoạt động của AR

(https://docs.mongodb.com/ruby-driver/master/tutorials/6.1.0/mongoid-relations/)

Trên là những nội dung mình tìm hiểu được và muốn chia sẻ ban đầu cho các bạn về cách sử dụng MongoDB trong Rails app. Mình sẽ cố gắng tìm hiểu kỹ hơn và sẽ có những bài chia sẻ sâu hơn sau này về chủ để trên.

Thân ái chào tạm biệt 😦((