1. ホーム
  2. sql

[解決済み] mongoの外部キー?

2022-01-29 01:59:51

質問

MongoDBでこのようなスキームを設計するにはどうしたらよいでしょうか。外部キーがないのでは!

どのように解決するのですか?

Mongoid や MongoMapper のような ORM を使うことに興味があるかもしれません。

http://mongoid.org/docs/relations/referenced/1-n.html

MongoDBのようなNoSQLデータベースでは、「テーブル」ではなく「コレクション」が存在します。ドキュメントはコレクション内にグループ化されています。どんな種類のドキュメントでも、どんな種類のデータでも、ひとつのコレクションに入れることができます。基本的に、NoSQLデータベースでは、データとその関係をどのように整理するかは、あなた次第です。

MongoidとMongoMapperがやっているのは、リレーションを簡単に設定できる便利なメソッドを提供することです。リンク先を見て、何でも聞いてみてください。

編集する

mongoidでは、このようにスキームを記述します。

class Student
  include Mongoid::Document

    field :name
    embeds_many :addresses
    embeds_many :scores    
end

class Address
  include Mongoid::Document

    field :address
    field :city
    field :state
    field :postalCode
    embedded_in :student
end

class Score
  include Mongoid::Document

    belongs_to :course
    field :grade, type: Float
    embedded_in :student
end


class Course
  include Mongoid::Document

  field :name
  has_many :scores  
end

編集する

> db.foo.insert({group:"phones"})
> db.foo.find()                  
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
{ "_id" : ObjectId("4df6540fe90592692ccc9941"), "group" : "phones" }
>db.foo.find({'_id':ObjectId("4df6539ae90592692ccc9940")}) 
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }

そのObjectIdを利用して、ドキュメント間のリレーションを行うことができます。