Docs Menu
Docs Home
/
MongoDB マニュアル
/ / /

ビューの作成とクエリ

項目一覧

  • db.createCollection() 構文
  • db.createView() 構文
  • 制限事項
  • サポートされていない操作
  • コレクションを入力する
  • db.createView() を使用してビューを作成する
  • db.createCollection() を使用してビューを作成する
  • 動作
  • 集計の最適化
  • リソースのロック

ビューを作成するには、次のいずれかの方法を使用します。

MongoDB Atlas UI でビューを作成するには、マテリアライズドビューを使用する必要があります。詳しくは、「MongoDB Atlas UI でマテリアライズドビューを作成する」を参照してください。

重要

ビュー名はコレクション リスト出力に含まれます

db.getCollectionInfos()db.getCollectionNames() などのコレクションを一覧表示する操作では、出力にビューが含まれます。

ビュー定義はパブリックです。つまり、ビューに対する db.getCollectionInfos() および explain操作には、ビューを定義するパイプラインが含まれます。そのため、ビュー定義で機密性の高いフィールドと値を直接参照することは避けてください。

db.createCollection(
"<viewName>",
{
"viewOn" : "<source>",
"pipeline" : [<pipeline>],
"collation" : { <collation> }
}
)
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
"collation" : { <collation> }
}
)
  • ソース コレクションと同じデータベースにビューを作成する必要があります。

  • ビュー定義pipelineには、$outまたは$mergeステージを含めることはできません。この制限は、$lookupステージまたは$facetステージで使用されるパイプラインなどの埋め込みパイプラインにも適用されます。

  • ビューは、一度作成すると名前を変更できません。

一部の操作は、ビューでは使用できません。

  • db.collection.mapReduce().

  • $text 演算子(これは、集計の $text は最初のステージでのみ有効であるためです)。

  • ビューの名前を変更します。

詳しくは、「ビューでサポートされている操作」を参照してください。

この例では、コレクションに学生データを入力し、データを照会するためのビューを作成しています。

この例で使用する students コレクションを作成します。

db.students.insertMany( [
{ sID: 22001, name: "Alex", year: 1, score: 4.0 },
{ sID: 21001, name: "bernie", year: 2, score: 3.7 },
{ sID: 20010, name: "Chris", year: 3, score: 2.5 },
{ sID: 22021, name: "Drew", year: 1, score: 3.2 },
{ sID: 17301, name: "harley", year: 6, score: 3.1 },
{ sID: 21022, name: "Farmer", year: 1, score: 2.2 },
{ sID: 20020, name: "george", year: 3, score: 2.8 },
{ sID: 18020, name: "Harley", year: 5, score: 2.8 },
] )

db.createView() を使用して、1 年生に限定したビューを作成します。

db.createView(
"firstYears",
"students",
[ { $match: { year: 1 } } ]
)

この例では、次のことが行われます。

  • firstYears は、新しいビューの名前です。

  • students は、ビューの基になっているコレクションです。

  • $match は、students コレクション内の 1 年生に一致する集計式です。

この例では、ビューをクエリしています。

db.firstYears.find({}, { _id: 0 } )

以下の出力には、1年生に関するデータを含むドキュメントのみが含まれています。{ _id: 0 } プロジェクションは、出力内の _id フィールドを抑制します。

[
{ sID: 22001, name: 'Alex', year: 1, score: 4 },
{ sID: 22021, name: 'Drew', year: 1, score: 3.2 },
{ sID: 21022, name: 'Farmer', year: 1, score: 2.2 }
]

注意

プロジェクションの制限

ビューに対するfind()操作は次のプロジェクション演算子をサポートしていません。

db.createCollection() メソッドを使用すると、特定のオプションを持つコレクションまたはビューを作成できます。

次の例では、graduateStudents ビューを作成しています。ビューには、$match ステージで選択されたドキュメントのみが含まれます。任意の照合設定によって並べ替え順序が決まります。

db.createCollection(
"graduateStudents",
{
viewOn: "students",
pipeline: [ { $match: { $expr: { $gt: [ "$year", 4 ] } } } ],
collation: { locale: "en", caseFirst: "upper" }
}
)

注意

照合動作

  • 作成時にビューのデフォルトの照合方法を指定できます。照合方法が指定されていない場合、ビューのデフォルトの照合には「単純な」バイナリ比較照合子が使用されます。つまり、ビューはコレクションのデフォルトの照合方法を継承しません。

  • ビューでの文字列比較では、ビューのデフォルトの照合方法が使用されます。ビューのデフォルトの照合方法を変更または上書きしようとする操作は、エラーとなり、失敗します。

  • 別のビューからビューを作成する場合、ソース ビューの照合方法と異なる照合方法を指定することはできません。

  • 複数のビューが関わる集計($lookup$graphLookup など)が実行される場合、それらのビューには同じ照合が含まれる必要があります。

次の例では、ビューをクエリします。$unset ステージでは、わかりやすくするために出力から _id フィールドが削除されます。

db.graduateStudents.aggregate(
[
{ $sort: { name: 1 } },
{ $unset: [ "_id" ] }
]
)

出力がソートされるとき、 $sort ステージは照合順序を使用して大文字を小文字より先にソートします。

[
{ sID: 18020, name: 'Harley', year: 5, score: 2.8 },
{ sID: 17301, name: 'harley', year: 6, score: 3.1 }
]

次のセクションでは、ビューの作成とクエリの動作について説明します。

ビューをクエリする場合:

  • クエリ filterprojectionsortskiplimit db.collection.find()、およびその他の操作は、同等の集計パイプライン ステージに変換されます。

  • MongoDB は、クライアント クエリを基礎となるパイプラインに追加し、その結合されたパイプラインの結果をクライアントに返します。MongoDB は、結合されたパイプラインに 集計パイプラインの最適化を適用する場合があります。

  • 集計パイプライン オプティマイザーは、ビュー集計パイプライン ステージを再形成してパフォーマンスを向上させます。 最適化によってクエリ結果は変更されません。

db.createView() は、操作中、指定されたコレクションまたはビューに対する排他ロックを取得します。コレクションに対する後続のすべての操作は、db.createView() がロックを解放するまで待機する必要があります。db.createView() は通常、このロックを短時間保持します。

ビューを作成するには、データベース内の system.views コレクションに対する追加の排他ロックを取得する必要があります。このロックは、コマンドが完了するまでデータベース内のビューの作成または変更をブロックします。

戻る

ビュー