web-dev-qa-db-ja.com

MongoDBのコレクションをどのように参照しますか?

これは、このフォーラムでの初めての投稿です。私はRDBMSの出身で、MongoDBへのアプリケーションの移行に役立つMongoDBについて学びたいと思っています。 2つのコレクション(顧客と住所)を作成しています。

顧客コレクション

名前、性別、都市、国、電話番号、住所などの一般的な情報があります(別のコレクションを参照する必要があります)。

アドレスコレクション

現在の住所、オフィスの住所、郵送先住所などの一連の情報があります。知りたいのですが、別のコレクションへの参照を追加するにはどうすればよいですか?このシナリオを考えると、Customer Collectionには、Address CollectionのIDへの参照を含める必要のあるAddressドキュメントがあります。

誰かがこのモデルのサンプル例を提供してくれたら。それは素晴らしいことだ。前もって感謝します。

2
Gokulnath Kumar

知りたいのですが、別のコレクションへの参照を追加するにはどうすればよいですか?

MongoDBの関係は、さまざまなドキュメントが相互に論理的にどのように関連付けられているかを表します。関係は、組み込みアプローチおよび参照アプローチを介してモデル化できます。そのような関係は、1:11:NN:1またはN:N

Modeling Referenced RelationshipsDBRefsを使用して実現できます。

ここでは、Modeling Referenced Relationshipsについて説明します。

顧客の住所を保存する場合を考えてみましょう。したがって、1人の顧客がこれを1:N関係にする複数のアドレスを持つことができます。

以下は、customerドキュメントのサンプルドキュメント構造です。

{
"_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Gokulnath Kumar",
   "gender": "Male",
   "city": "Doha",
   "country": "Qatar",
   "Phone": "777 95057",
   "address": "100A, Doha,Qatar"
})

以下は、address文書のサンプル文書構造です-

{
"_id":ObjectId("52ffc4a5d85242602e000000"),
   "address": "100A, Doha,Qatar",
   "office address": " 200B, Doha Qatar",
   "mailing address": "[email protected]"
} 

理解を深めるために、最初にここにModeling Embedded Relationshipsと書き留めておきます。@ JJussiは、modeling Embedded Relationshipを使用して1つのコレクションにすべてのドキュメント情報を書き留めることができるとすでに言っています。

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

埋め込まれた関係のモデリング

MongoDBのデータには、柔軟なスキーマがあります。コレクションはドキュメント構造を強制しません。データのモデル化方法に影響を与える決定は、アプリケーションのパフォーマンスとデータベースの容量に影響を与える可能性があります。

このドキュメントでは、埋め込まれたドキュメントを使用して、接続されたデータ間の関係を記述するデータモデルについて説明します。

アプリケーションが名前情報を含む住所データを頻繁に取得する場合、アプリケーションは参照を解決するために複数のクエリを発行する必要があります。より最適なスキーマは、次のドキュメントのように、顧客データに住所データエンティティを埋め込むことです。

{
"_id":ObjectId("52ffc33cd85242f436000001"),
    "name": "Gokulnath Kumar",
   "gender": "Male",
   "city": "Doha",
   "country": "Qatar",
   "Phone": "777 95057",
   "address": [
{
"address": "100A, Doha,Qatar",
   "office address": " 200B, Doha Qatar",
   "mailing address": "[email protected]"
}]}

次に、参照関係のモデリング

これは、normalized relationshipを設計するアプローチです。このアプローチでは、customeraddressの両方のドキュメントが別々に維持されますが、顧客のドキュメントにはaddressドキュメントのid field

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Gokulnath Kumar",
   "gender": "Male",
   "city": "Doha",
   "country": "Qatar",
   "Phone": "777 95057",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

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

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

さらにあなたの参照 ここここ および ここ

1