Mongodb-relationships

提供:Dev Guides
移動先:案内検索

MongoDB-関係

MongoDBの関係は、さまざまなドキュメントが論理的に相互にどのように関連しているかを表します。 関係は、 Embedded および Referenced アプローチを介してモデル化できます。 このような関係は、1:1、1:N、N:1、またはN:Nのいずれかです。

ユーザーのアドレスを保存する場合を考えてみましょう。 したがって、1人のユーザーが複数のアドレスを持ち、これを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"
            }
        ]
    }
})

このアプローチでは、関連するすべてのデータが単一のドキュメントに保持されるため、取得と管理が簡単になります。 文書全体は、次のような単一のクエリで取得できます-

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

上記のクエリでは、 dbusers がそれぞれデータベースとコレクションであることに注意してください。

欠点は、埋め込みドキュメントのサイズが大きくなり続けると、読み取り/書き込みパフォーマンスに影響を与える可能性があることです。

参照関係のモデリング

これは、正規化された関係を設計するアプローチです。 このアプローチでは、ユーザー文書と住所文書の両方が個別に維持されますが、ユーザー文書には住所文書の id フィールドを参照するフィールドが含まれます。

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

上記のように、ユーザードキュメントには、対応するアドレスのObjectIdを含む配列フィールド address_ids が含まれています。 これらのObjectIdを使用して、住所ドキュメントを照会し、そこから住所の詳細を取得できます。 このアプローチでは、2つのクエリが必要になります。1つ目は user ドキュメントから address_ids フィールドを取得し、2つ目は address コレクションからこれらのアドレスを取得します。

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