MongoDBは通常、グラフの関係をモデル化するのには適していません。このタスクに優れた特殊なグラフデータベースがあります。
ただし、別のデータベーステクノロジーをミックスに追加したくない場合は、新しいコレクションfrienships
を作成することをお勧めします。 そして、各フレンド関係を2つのエントリの配列を持つドキュメントとしてモデル化します。各エントリは、フレンドリストにエントリを表示するために必要なユーザーの1人に関する省略情報を含むオブジェクトです。
{
friendship: [
{
id:123,
name: "Bob",
avatar: "Bob.jpg"
},
{
id:456,
name: "Alice",
avatar: "Alice.jpg"
}
]
}
フレンドシップドキュメント内のユーザードキュメントから情報を複製する理由は、ユーザーのフレンドリストを表示するためのすべてのデータを取得するためのユーザーコレクションへの2番目のクエリを回避するためです。 MongoDBは結合できません シャーディングされていないコレクションでのみJOINを実行できます
したがって、冗長性を作成することを意味する場合でも、特定のユースケースに必要なデータを複数のコレクションに分散させないようにする必要があります。そうしないと、複数のクエリを次々に実行する必要があり、アプリケーションの応答時間が大幅に遅くなります。
ユーザー123のフレンドリストを取得する場合は、db.friendships.find({"friendship.id", 123})
を実行します。 (friendship.id
のインデックス パフォーマンスが向上します)そして、ボブが最初または2番目の友人であるドキュメントのリストを受け取ります。
次に、これらのドキュメントを繰り返し、配列エントリの短い情報を出力します。これはではありません。 ユーザー123。
または、集計パイプラインを使用して、データベースのボブエントリを除外することもできます。上記の$matchクエリを使用し、friendship-arrayを$ unwindしてから、idが123でないドキュメントを$ matchします。これはトレードオフになります。データベースサーバーのCPU負荷を犠牲にして、帯域幅を節約します。
>友情関係がすでに存在するかどうかを問い合わせるには、次を使用します。
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();