db.createView()
db.createView()
注意
次のページではビューについて説明します。 オンデマンドのマテリアライズドビューについて詳しくは、代わりに
$merge
を参照してください。指定された集計パイプラインをソース コレクションまたはビューに適用して、ビューを作成します。ビューは読み取り専用のコレクションとして機能し、読み取り操作中にオンデマンドで計算されます。ソース コレクションと同じデータベースにビューを作成する必要があります。MongoDB では、基礎となる集計パイプラインの一部としてビューに対して読み取り操作が実行されます。
ビュー定義
pipeline
には$out
または$merge
ステージを含めることはできません。 ビュー定義にネストされたパイプラインが含まれている場合(たとえば、ビュー定義に$lookup
または$facet
ステージが含まれている場合)、この制限はネストされたパイプラインにも適用されます。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
db.createView
の構文は次のとおりです。
db.createView(<view>, <source>, <pipeline>, <options>)
メソッドは次のパラメーターを受け入れます:
Parameter | タイプ | 説明 |
---|---|---|
| string | 作成するビューの名前。 |
| string | ビューを作成するソース・コレクションまたはビューの名前。 名前はコレクションまたはビューの完全な名前空間ではありません。つまり、データベース名が含まれておらず、作成するビューと同じデータベースであることを暗示します。 ソース コレクションと同じデータベースにビューを作成する必要があります。 |
| 配列 | 集計パイプラインステージ で構成される配列。 は、指定された ビュー定義 ビュー定義はパブリックです。つまり、ビューに対する |
| ドキュメント | 任意。 メソッドの追加オプション。 |
オプションドキュメントには、次のオプションフィールドが含まれています。
フィールド | タイプ | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 任意: ビューのデフォルトの照合設定を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 基になる 照合方法が指定されていない場合、ビューのデフォルトの照合には「単純な」バイナリ比較照合子が使用されます。 基になる 照合オプションの構文は次のとおりです。
照合を指定する場合、 バージョン 3.4 で追加。 |
db.createView()
メソッドは次のcreate
コマンド操作をラップします。
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )
コレクションを一覧表示する操作db.getCollectionInfos()
やdb.getCollectionNames()
など)では、出力にビューが含まれます。
重要
ビュー定義はパブリックです。つまり、ビューに対する db.getCollectionInfos()
および explain
操作には、ビューを定義するパイプラインが含まれます。そのため、ビュー定義で機密性の高いフィールドと値を直接参照することは避けてください。
ビューを削除するには、ビューでdrop()
メソッドを使用します。
動作
ビューは、次の動作を示します。
読み取り専用
ビューは読み取り専用です。ビューに対する書込み操作はエラーになります。
次の読み取り操作ではビューをサポートできます。
インデックス使用とソート操作
ビューでは、基になるコレクションのインデックスが使用されます。
インデックスは基礎となるコレクションにあるため、ビューでインデックスを直接作成、削除、再構築したり、ビューでインデックスのリストを取得したりすることはできません。
MongoDB 4.4 以降では、ビューで コマンドを実行するときに
$natural
find
の並べ替えを指定できます。MongoDB の以前のバージョンでは、ビューでの$natural
ソートはサポートされていません。ビューの基盤となる集計パイプラインには、ブロッキングソート操作とブロッキンググループ操作のメモリ制限が 100 MB に制限されます。 MongoDB 4.4 以降では、 ビューで
allowDiskUse: true
を使用してfind
コマンドを発行し、MongoDB がブロッキングソートとグループ操作に一時ファイルを使用できるようにします。MongoDB 4.4 より前では、
aggregate
コマンドのみがallowDiskUse
オプションを受け入れていました。
プロジェクションの制限
不変名
ビューの名前を変更することはできません。
ビューの作成
ビューは読み取り操作中にオンデマンドで計算され、MongoDB は基礎となる集計パイプラインの一部としてビューに対して読み取り操作を実行します。 そのため、ビューでは次のような操作はサポートされていません。
ビューの作成に使用される集計パイプラインが
_id
フィールドを抑制している場合、ビュー内のドキュメントには_id
フィールドは表示されません。
ビューをクエリすると、
クエリ
filter
、projection
、sort
、skip
、limit
db.collection.find()
、およびその他の操作は、同等の集計パイプライン ステージに変換されます。変換された集計パイプライン ステージは、ビューの集計パイプラインの末尾に追加されます。 これによって、ビューの作成時に設定されるビューの基礎となるパイプラインは変更されません。
集計パイプライン オプティマイザーは、ビュー集計パイプライン ステージを再形成してパフォーマンスを向上させます。 これによってクエリ結果は変更されません。
シャードビュー
ビューは、基になるコレクションがシャーディングされている場合、シャーディングされたと見なされます。 そのため、 $lookup
操作と$graphLookup
操作ではfrom
フィールドのシャーディングされたビューを指定できません。
ビューと照合
作成時にビューのデフォルトの照合方法を指定できます。照合方法が指定されていない場合、ビューのデフォルトの照合には「単純な」バイナリ比較照合子が使用されます。つまり、ビューはコレクションのデフォルトの照合方法を継承しません。
ビューでの文字列比較では、ビューのデフォルトの照合方法が使用されます。ビューのデフォルトの照合方法を変更または上書きしようとする操作は、エラーとなり、失敗します。
別のビューからビューを作成する場合、ソース ビューの照合方法と異なる照合方法を指定することはできません。
複数のビューが関わる集計(
$lookup
や$graphLookup
など)が実行される場合、それらのビューには同じ照合が含まれる必要があります。
リソースのロック
バージョン 4.2 で変更。
db.createView()
は、操作中、指定されたコレクションまたはビューに対する排他ロックを取得します。 コレクションに対する後続のすべての操作は、 db.createView()
がロックを解放するまで待機する必要があります。 db.createView()
は通常、このロックを短時間保持します。
ビューを作成するには、データベース内の system.views
コレクションに対する追加の排他ロックを取得する必要があります。このロックは、コマンドが完了するまでデータベース内のビューの作成または変更をブロックします。
MongoDB 4.2より前は、 db.createView()
は親データベースに対して排他ロックを取得し、操作が完了するまでデータベースとそのコレクションに対するすべての操作をブロックします。
アクセス制御
ビューを作成するには、ビューが作成されるデータベースに対する
createCollection
特権が必要です。さらに、作成するビューの名前空間に対してfind
特権がある場合は、次のリソースに対するfind
特権も必要です。新しいビューの作成元となるソースコレクションまたはビュー。
ビューをクエリするには、ビューの名前空間に対する
find
特権が必要です。ソースコレクションまたは ビューパイプラインで参照される名前空間では、find
特権は必要ありません。
readWrite
データベースに対して組み込み ロールを持つユーザーは、リスト内の操作を実行するために必要な特権があります。必要な権限を付与するには、次のいずれかを実行します。
例
単一のコレクションからのビューの作成
次のドキュメントを含むコレクションsurvey
がある場合:
{ _id: 1, empNumber: "abc123", feedback: { management: 3, environment: 3 }, department: "A" } { _id: 2, empNumber: "xyz987", feedback: { management: 2, environment: 3 }, department: "B" } { _id: 3, empNumber: "ijk555", feedback: { management: 3, environment: 4 }, department: "A" }
次の操作は、_id
、feedback.management
、および department
フィールドを持つ managementFeedback
ビューを作成します。
db.createView( "managementFeedback", "survey", [ { $project: { "management": "$feedback.management", department: 1 } } ] )
ビューのクエリ
ビューをクエリするには、ビューでdb.collection.find()
を使用します。
db.managementFeedback.find()
この操作により、次のドキュメントが返されます。
{ "_id" : 1, "department" : "A", "management" : 3 } { "_id" : 2, "department" : "B", "management" : 2 } { "_id" : 3, "department" : "A", "management" : 3 }
ビューで集計パイプラインを実行
次の操作では、 $sortByCount
を使用してdepartment
フィールドでグループ化し、各部門のカウントの降順で並べ替えて、 managementFeedback
ビューで集計を実行します。
db.managementFeedback.aggregate([ { $sortByCount: "$department" } ] )
この操作により、次のドキュメントが返されます。
{ "_id" : "A", "count" : 2 } { "_id" : "B", "count" : 1 }
複数のコレクションからビューを作成
次の 2 つのコレクションがあるとします。
orders
コレクション:{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12.00"), "quantity" : 2 } { "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20.00"), "quantity" : 1 } { "_id" : 3, "item" : "abc", "price" : NumberDecimal("10.95"), "quantity" : 5 } { "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 5 } { "_id" : 5, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 10 } inventory
コレクション:{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 } { "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 } { "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 } { "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 } { "_id" : 5, "sku" : "xyz", description: "product 5", "instock" : 200 }
次のdb.createView()
の例では、2 つのコレクションの結合からビューを作成するための$lookup
ステージを指定しています。
db.createView ( "orderDetails", "orders", [ { $lookup: { from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs" } }, { $project: { "inventory_docs._id": 0, "inventory_docs.sku": 0 } } ] )
ビューのクエリ
ビューをクエリするには、ビューでdb.collection.find()
を使用します。
db.orderDetails.find()
この操作により、次のドキュメントが返されます。
{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12.00"), "quantity" : 2, "inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ] } { "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20.00"), "quantity" : 1, "inventory_docs" : [ { "description" : "product 4", "instock" : 70 } ] } { "_id" : 3, "item" : "abc", "price" : NumberDecimal("10.95"), "quantity" : 5, "inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ] } { "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 5, "inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ] } { "_id" : 5, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 10, "inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ] }
ビューで集計パイプラインを実行
次の操作では、 $sortByCount
を使用してitem
フィールドでグループ化し、個別のアイテムごとのカウントの降順で並べ替えて、 orderDetails
ビューで集計を実行します。
db.orderDetails.aggregate( [ { $sortByCount: "$item" } ] )
この操作により、次のドキュメントが返されます。
{ "_id" : "xyz", "count" : 2 } { "_id" : "abc", "count" : 2 } { "_id" : "jkl", "count" : 1 }
デフォルトの照合順序を使用したビューの作成
次のドキュメントを含むplaces
コレクションがある場合:
{ _id: 1, category: "café" } { _id: 2, category: "cafe" } { _id: 3, category: "cafE" }
次の操作では ビューが作成され、ビュー レベルで照合を指定します。
db.createView( "placesView", "places", [ { $project: { category: 1 } } ], { collation: { locale: "fr", strength: 1 } } )
ビューでの string 比較では、ビューのデフォルトの照合方法が使用されます。 たとえば、次の操作ではビューの照合順序を使用します。
db.placesView.count( { category: "cafe" } )
この操作では、3
を返します。
ビューのデフォルトの照合方法を変更または上書きしようとする操作は、エラーとなり、失敗します。