データを正規化して保存することで、書き込み量と読み込み量が少なくなった場合に役立ちます。ここでの効率は、データの検索方法によって異なります。コレクションからのデータの取得に双方向参照が必要な場合は、すでにそれがある場合は、確かにクエリの効率が向上します。
学生コレクション
{ _id:1, name: "Joseph", courses:[1, 3, 4]}
{ _id:2, name: "Mary", courses:[1, 3]}
{ _id:3, name: "Catherine", courses:[1, 2, 4]}
{ _id:4, name: "Robert", courses:[2, 4]}
コースコレクション
{ _id:1, name: "Math101", students: [1, 2, 3]}
{ _id:2, name: "Science101", students: [3, 4]}
{ _id:3, name: "History101", students: [1, 2]}
{ _id:4, name: "Astronomy101", students: [1, 3, 4]}
ここでは2つの方法の参照が行われ、学生のコレクションのコース配列が私たちを与え、学生とコースの上記の例を考えてみましょう学生が学んださまざまなコース。同様に、コースコレクションのStudents配列は、それぞれのコースを勉強している学生を私たちに与えます。
我々は、クエリが
db.courses.aggregate([{$match: {name:"Math101"}},
{$unwind:"$students"},
{$lookup:{from:"students",
localField:"students",
foreignField:"_id",
as:"result"}}])
$match、$unwindだろうMath101を研究していた学生の一覧を表示したい場合は、アグリゲーションパイプラインの$lookupは、結果を達成するために使用されています。データを減らすための$ match(集約パイプラインの最初にこの演算子を使用するとよい)、Coursesコレクションのstudents配列を巻き戻す$ unwind、Studentsコレクションを調べて学生の詳細を取得する$
私たちのサンプルのコレクションで上記の集計クエリを実行した後の結果は、したがって密接にあなたの期待される結果と整合し、あなたのスキーマを設計し、
{
"_id" : 1,
"name" : "Math101",
"students" : 1,
"result" : [
{
"_id" : 1,
"name" : "Joseph",
"courses" : [
1,
3,
4
]
}
]
}
{
"_id" : 1,
"name" : "Math101",
"students" : 2,
"result" : [
{
"_id" : 2,
"name" : "Mary",
"courses" : [
1,
3
]
}
]
}
{
"_id" : 1,
"name" : "Math101",
"students" : 3,
"result" : [
{
"_id" : 3,
"name" : "Catherine",
"courses" : [
1,
2,
4
]
}
]
}
我々が取得した内容に基づいて、純粋に参照する双方向の効率です。