2

別のコレクション内のこれらのドキュメントへの参照の存在に基づいて、コレクションからドキュメントを取得しようとしています。

2 つのコレクションがあり、モデルが次のようにUsersなっCoursesているとします。

  • ユーザー:{_id, name}
  • コース:{_id, name, user_id}

注: これは単なる架空の例であり、実際の使用例ではありません。の名前フィールドで重複が問題ないと仮定しましょうCourse。痩せましょうCourse as CourseRegistrations

ここでは、 の を保持して への参照を維持していUserます。また、文字列として保存されていることに注意してください。Courseuser_id_IdUser

ここで、特定のコース セットに登録されているすべてのユーザーを取得したいと考えています。

2つのクエリで実行できることを知っています。最初にクエリを実行し、一連のコースusers_idのコレクションからフィールドを取得します。Course次に、前のクエリで取得したユーザー IDUserを使用してコレクションをクエリします。$inしかし、ドキュメントの数が数万以上になると、これはうまくいかないかもしれません。

たった1回のクエリでこれを行うより良い方法はありますか?

4

1 に答える 1

1

あなたが言っていることは典型的なものsql joinです。しかし、mongodbではそれは不可能です。すでに提案したように、2つの異なるクエリでそれを行うことができます。

それを処理するもう1つの方法があります。これは正確な解決策ではありませんが、NonSqlデータベースでの有効な回避策です。これは、最も頻繁にアクセスされるフィールドを同じコレクション内に格納することです。

user一部のコレクションフィールドは、course埋め込みフィールドとしてコレクション内に保存できます。

Course : {
   _id : 'xx',
   name: 'yy'
   user:{
       fname : 'r',
       lname :'v',
       pic: 's'
   }  
}

これは、ユーザーコレクションから取得するフィールドのサブセットが少ない場合に適したアプローチです。コレクションに保存されている冗長なユーザーデータについて疑問に思われるかもしれませんがcourse、それこそがmongodbを強力なものにしているのです。1回限りの挿入ですが、クエリははるかに高速になります。

于 2012-11-05T14:41:05.090 に答える