Sử Dụng MongoDB Với Gem MongoID Phần V

Sử dụng MongoDB với gem MongoID Phần V

  1. Mongoid(tiếp)
    • Metadata
      Tất cả các mối quan hệ trong MongoDB chứa metadata chứa thông tin về các mối quan hệ trong câu hỏi, và là một công cụ có giá trị cho các nhà phát triển bên thứ ba sử dụng để mở rộng Mongoid. Bạn có thể truy cập vào metadata của các relation bằng 1 số cách
    [1] pry(main)> Book.reflect_on_association :user
    => {:relation=>Mongoid::Relations::Referenced::In, :extend=>nil, :inverse_class_name=>"Book", :name=>:user, :validate=>false}
    [2] pry(main)> Book.first.reflect_on_association :test
      MOPED: 127.0.0.1:27017 QUERY        database=test_development collection=books selector={"$query"=>{"deleted_at"=>nil}, "$orderby"=>{"created_at"=>-1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 2.0707ms
    => {:relation=>Mongoid::Relations::Referenced::In, :extend=>nil, :inverse_class_name=>"Book", :name=>:user, :validate=>false}
+ The Metadata Object<br>
Các đối tượng `metadata` chính nó chứa nhiều thông tin hơn người ta có thể biết những gì để làm, và có ích cho sự mở rộng của MongoDB.<br>
Tham khảo thêm tại đây [the-metadata-object](https://docs.mongodb.org/ecosystem/tutorial/ruby-mongoid-tutorial/#the-metadata-object)
- Embeds One <br>
Với mối quan hệ 1 - 1, lớp con được nhúng vào trong lớp cha được định nghĩa bằng các sử dụng `embeds_one` và `embedded_in`
        class User
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :first_name, type: String
          field :last_name, type: String
          field :age, type: Integer, default: 18
          field :address, type: Array
          validates :last_name, presence: true

          embeds_one :book
        end
        class Book
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :name, type: String
          field :author, type: String
          field :description, type: String
          field :user_id, type: Integer
          field :country, type: String

          embedded_in :user
        end
    [8] pry(main)> User.last.as_json
      MOPED: 127.0.0.1:27017 QUERY        database=test_development collection=users selector={"$query"=>{"deleted_at"=>nil}, "$orderby"=>{:_id=>-1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 12.2014ms
        => {"_id"=><BSON::ObjectId:0x12727340 data=56a5cefa66726163a2000001>,
         "address"=>nil,
         "age"=>18,
         "book"=>
             {"_id"=><BSON::ObjectId:0x12718120 data=567b5d4266726124fd000001>,
             "author"=>"author",
             "country"=>"en",
             "created_at"=>Thu, 24 Dec 2015 02:49:42 UTC +00:00,
             "deleted_at"=>nil,
             "description"=>nil,
             "name"=>"name",
             "user_id"=><BSON::ObjectId:0x61775740 data=567b5c4866726124d1000000>,
             "updated_at"=>Mon, 04 Jan 2016 00:32:42 UTC +00:00
             },
         "created_at"=>Mon, 25 Jan 2016 07:30:06 UTC +00:00,
         "deleted_at"=>nil,
         "first_name"=>nil,
         "last_name"=>"Last Name",
         "updated_at"=>Mon, 25 Jan 2016 07:30:06 UTC +00:00}
- Storage <br>
`Document`sử dụng các macro `embeds_one` được lưu giữ như là một `hash` bên cha mẹ trong bộ sưu tập cơ sở dữ liệu của cha mẹ.<br>
Bạn có thể có tùy chọn cho `Mongoid` khác thuộc tính của tên bằng cách cung cấp tùy chọn`:store_as`
        class User
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :first_name, type: String
          field :last_name, type: String
          field :age, type: Integer, default: 18
          field :address, type: Array
          validates :last_name, presence: true

          embeds_one :book, store_as: "test"
        end
    [4] pry(main)> user.as_json
    => {"_id"=><BSON::ObjectId:0x35765720 data=56a5d29b66726169ef000000>,
     "address"=>["ha noi"],
     "age"=>18,
     "created_at"=>Mon, 25 Jan 2016 07:45:39 UTC +00:00,
     "deleted_at"=>nil,
     "first_name"=>"First Name",
     "last_name"=>"Last Name",
     "test"=>
         {
         "_id"=><BSON::ObjectId:0x34328560 data=567b5d4266726124fd000001>,
         "deleted_at"=>nil,
         "name"=>"name",
         "author"=>"author",
         "country"=>"en",
         "user_id"=><BSON::ObjectId:0x34327500 data=567b5c4866726124d1000000>,
         "updated_at"=>2016-01-04 00:32:42 UTC,
         "created_at"=>2015-12-24 02:49:42 UTC
         },
     "updated_at"=>Mon, 25 Jan 2016 07:45:39 UTC +00:00}
- Embeds Many<br>
Với mối quan hệ 1 - n, lớp con được nhúng vào trong lớp cha được định nghĩa bằng các sử dụng `embeds_many` và `embedded_in`
        class User
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :first_name, type: String
          field :last_name, type: String
          field :age, type: Integer, default: 18
          field :address, type: Array
          validates :last_name, presence: true

          embeds_many :books
        end
        class Book
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :name, type: String
          field :author, type: String
          field :description, type: String
          field :user_id, type: Integer
          field :country, type: String

          embedded_in :user
        end
    [7] pry(main)> User.first.as_json
      MOPED: 127.0.0.1:27017 QUERY        database=test_development collection=users selector={"$query"=>{"deleted_at"=>nil}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.4957ms
    => {"_id"=><BSON::ObjectId:0x61152180 data=567b5c4866726124d1000000>,
     "address"=>["HaNoi"],
     "age"=>18,
     "books"=>
      [{"_id"=><BSON::ObjectId:0x61150700 data=567b5d4266726124fd000001>,
        "author"=>"author",
        "country"=>"en",
        "created_at"=>Thu, 24 Dec 2015 02:49:42 UTC +00:00,
        "deleted_at"=>nil,
        "description"=>nil,
        "name"=>"name",
        "user_id"=><BSON::ObjectId:0x61149960 data=567b5c4866726124d1000000>,
        "updated_at"=>Mon, 04 Jan 2016 00:32:42 UTC +00:00,
        }],
     "created_at"=>Thu, 24 Dec 2015 02:45:28 UTC +00:00,
     "deleted_at"=>nil,
     "first_name"=>"First Name",
     "last_name"=>"Last Name",
     "updated_at"=>Thu, 24 Dec 2015 02:45:28 UTC +00:00}
- Tương tự như `Embeds One` ta cũng có thể định nghĩa lại `storage` bằng cách sử dụng tùy chọn `:store_as`
- Has One<br>
Mối quan hệ `one to one` được tham chiếu đến lớp cha thông qua định nghĩa `has_one` và `belongs_to`
- Defining: Lớp cha định nghĩa mối quan hệ đến lớp con thông qua `has_one`, lớp con định nghĩa lớp cha tham chiếu thông qua việc sử dụng `belongs_to`
        class User
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :first_name, type: String
          field :last_name, type: String
          field :age, type: Integer, default: 18
          field :address, type: Array
          validates :last_name, presence: true

          has_one :books, dependent: :destroy
        end
        class Book
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :name, type: String
          field :author, type: String
          field :description, type: String
          field :user_id, type: Integer
          field :country, type: String

          belongs_to :user
       end
- Storage: Khi xác định một mối quan hệ có tính chất này, mỗi `document` được lưu trữ trong `collection` tương ứng của nó, nhưng `documents` con có chứa một "foreign key" tham chiếu đến lớp cha.
     [1] pry(main)> User.first
      MOPED: 127.0.0.1:27017 QUERY        database=test_development collection=users selector={"$query"=>{"deleted_at"=>nil}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.8634ms
    => #<User _id: 567b5c4866726124d1000000, created_at: 2015-12-24 02:45:28 UTC, updated_at: 2015-12-24 02:45:28 UTC, deleted_at: nil, first_name: "First Name", last_name: "Last Name", age: 18, address: ["HaNoi"]>
    [2] pry(main)> User.first.book
    => #<Book _id: 567b5d4266726124fd000001, created_at: 2015-12-24 02:49:42 UTC, updated_at: 2016-01-04 00:32:42 UTC, deleted_at: nil, name: "name", author: "author", description: nil, country: "en", user_id: <BSON::ObjectId:0x56675480 data=567b5c4866726124d1000000>>
- Has Many<br>
 Cũng tương tự như `has_one`, lớp cha định nghĩa thông qua `has_many`, lớp con tham chiếu bằng `belongs_to`
        class User
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :first_name, type: String
          field :last_name, type: String
          field :age, type: Integer, default: 18
          field :address, type: Array
          validates :last_name, presence: true

          has_many :books, dependent: :destroy
        end
        class Book
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :name, type: String
          field :author, type: String
          field :description, type: String
          field :user_id, type: Integer
          field :country, type: String

          belongs_to :user
        end
- Has And Belongs To Many<br>
 Quan hệ `Many to many` có thể được định nghĩa trong `mongoid` thông qua định nghĩa `has_and_belongs_to_many`,các id chính `foreign key` được lưu trữ như là các mảng ở hai bên của mối quan hệ.
        class User
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :first_name, type: String
          field :last_name, type: String
          field :age, type: Integer, default: 18
          field :address, type: Array
          validates :last_name, presence: true

          has_and_belongs_to_many :book, dependent: :destroy
        end
         class Book
          include Mongoid::Document
          include Mongoid::Timestamps
          include Mongoid::Paranoia
          include Mongoid::Attributes::Dynamic

          field :name, type: String
          field :author, type: String
          field :description, type: String
          field :user_id, type: Integer
          field :country, type: String

          has_and_belongs_to_many :tests
        end
     [1] pry(main)> User.first
      MOPED: 127.0.0.1:27017 QUERY        database=test_development collection=users selector={"$query"=>{"deleted_at"=>nil}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.7157ms
    => #<User _id: 56a985146672612ca3000000, created_at: 2016-01-28 03:03:56 UTC, updated_at: 2016-01-28 03:03:56 UTC, deleted_at: nil, first_name: "First Name", last_name: "Last Name", age: 18, address: ["HaNoi"], book_ids: [<BSON::ObjectId:0x40834720 data=56a984706672612b5b000000>]>
    [2] pry(main)> Book.first
      MOPED: 127.0.0.1:27017 QUERY        database=test_development collection=books selector={"$query"=>{"deleted_at"=>nil}, "$orderby"=>{"created_at"=>-1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.5791ms
    => #<Book _id: 56a984706672612b5b000000, created_at: 2016-01-28 03:01:04 UTC, updated_at: 2016-01-28 03:01:04 UTC, deleted_at: nil, name: "Name", author: "Author", description: "Description", country: "en", user_ids: [<BSON::ObjectId:0x39087640 data=56a985146672612ca3000000>]>