12/08/2018, 13:12
Sử Dụng MongoDB Với Gem MongoID Phần V
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] ...
- 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
- Metadata
[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>]>