English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB リレーション

MongoDBでは、関係は異なるドキュメント間の論理関係を表します。関係は埋め込みと参照の方法でモデル化できます。関係は以下のようになります。1:1、1:N、N:1またはN:Nです。

ユーザーが住所を保存する場合を考えてみましょう。したがって、ユーザーには複数の住所が存在し、これが関係を形成します。1:Nの関係です。

以下はドキュメントの例の構造ですuser-

{
   "_id":ObjectId("52ffc33cd85242f436000001")
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

以下はドキュメントの例の構造ですaddress-

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

埋め込み関係モデルの設計

埋め込み方法では、アドレスドキュメントをユーザードキュメントに埋め込みます。

>db.users.insert({
	{
		"_id":ObjectId("52ffc33cd85242f436000001")
		"contact": "987654321",
		"dob": "01-01-1991",
		"name": "Tom Benzamin",
		"address": [
			{
				"building": "22 A, Indiana Apt",
				"pincode": 123456,
				"city": "Los Angeles",
				"state": "California"
			},
			{
				"building": "170 A, Acropolis Apt",
				"pincode": 456789,
				"city": "Chicago",
				"state": "Illinois"
			}
		}
	}
})

この方法では、すべての関連データを1つのドキュメントに保存します。これにより、検索とメンテナンスが簡単になります。例えば、1つのクエリで整个ドキュメントを検索できます。-

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

注意:上記のクエリでは、dbおよびusersそれぞれデータベースとコレクションです。

欠点は、もし埋め込まれたドキュメントのサイズが持続的に大きくなると、読み取りに影響を与える可能性があります。/書き性能

参照関係モデルの設計

これは規範化された関係設計の方法です。この方法では、ユーザードキュメントとアドレスドキュメントは分離してメンテナンスされますが、ユーザードキュメントにはアドレスドキュメントのIDフィールドの参照フィールドが含まれます。

{
   "_id":ObjectId("52ffc33cd85242f436000001")
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001)
   }
}

上記のように、ユーザードキュメントには配列フィールド address_ids があり、それには対応するアドレスの ObjectId が含まれています。これらの ObjectId を使用して、アドレスドキュメントをクエリし、そこからアドレスの詳細情報を取得することができます。この方法を使用すると、2つのクエリが必要になります:まずaddress_idsからuserドキュメントからフィールドを取得し、次にaddressこれらのアドレスをコレクションから取得。

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})