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

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
タイプ
説明

view

string

作成するビューの名前。

source

string

ビューを作成するソース・コレクションまたはビューの名前。 名前はコレクションまたはビューの完全な名前空間ではありません。つまり、データベース名が含まれておらず、作成するビューと同じデータベースであることを暗示します。 ソース コレクションと同じデータベースにビューを作成する必要があります。

pipeline

配列

集計パイプラインステージ で構成される配列。 は、指定されたdb.createView() pipelinesource コレクションまたはビューに適用してビューを作成します。

ビュー定義pipelineには$outまたは$mergeステージを含めることはできません。 ビュー定義にネストされたパイプラインが含まれている場合(たとえば、ビュー定義に$lookupまたは$facetステージが含まれている場合)、この制限はネストされたパイプラインにも適用されます。

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

options

ドキュメント

任意。 メソッドの追加オプション。

オプションドキュメントには、次のオプションフィールドが含まれています。

フィールド
タイプ
説明

collation

ドキュメント

任意: ビューのデフォルトの照合設定を指定します。

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

基になる source がコレクションの場合、ビューはコレクションの照合設定を継承しません。

照合方法が指定されていない場合、ビューのデフォルトの照合には「単純な」バイナリ比較照合子が使用されます。

基になる source が別のビューである場合、そのビューで同じ照合設定を指定する必要があります。

照合オプションの構文は次のとおりです。

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

照合を指定する場合、locale フィールドは必須ですが、その他の照合フィールドはすべて任意です。フィールドの説明については、照合ドキュメントを参照してください。

バージョン 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オプションを受け入れていました。

    Tip

    以下も参照してください。

    ブロッキングソート操作のメモリ制限の詳細については、「ソート操作 」を参照してください。

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

ビューの名前を変更することはできません。

  • ビューは読み取り操作中にオンデマンドで計算され、MongoDB は基礎となる集計パイプラインの一部としてビューに対して読み取り操作を実行します。 そのため、ビューでは次のような操作はサポートされていません。

  • ビューの作成に使用される集計パイプラインが_idフィールドを抑制している場合、ビュー内のドキュメントには_idフィールドは表示されません。

ビューをクエリすると、

  • クエリ filterprojectionsortskiplimit 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" }

次の操作は、_idfeedback.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 を返します。

ビューのデフォルトの照合方法を変更または上書きしようとする操作は、エラーとなり、失敗します。

Tip

以下も参照してください。

戻る

db.createCollection