FAQ: MongoDB Fundamentals
項目一覧
このドキュメントでは、MongoDB に関するよくある質問に答えます。
MongoDB はどのプラットフォームをサポートしていますか?
サポートされているプラットフォームのリストについては、「 プラットフォームのサポート 」を参照してください。
MongoDB はホストするサービスとして提供されていますか?
はい。 MongoDB Atlas はクラウドでホストされるサービスとしてのデータベースです。詳細については、 MongoDB Atlasをご覧ください。
コレクションとテーブルの違いは何ですか?
MongoDB databaseは、テーブルの代わりにコレクションにデータをストアします。コレクションには 1 つ以上のBSON ドキュメントが保持されます。ドキュメントは、関係データベーステーブル内のレコードまたは行に類似しています。各ドキュメントには 1 つまたは複数のフィールドがあります。フィールドは関係データベーステーブルの列に似ています。
データベースとコレクションを作成するにはどうすればよいですか?
注意
この FAQ で参照されているコマンドは、 MongoDB Shell
を使用して入力します。MongoDB Shell とは、MongoDB のインタラクティブ JavaScript インターフェースです。MongoDB Shell を使用して、データのクエリとアップデート、および管理操作を実行します。
データベースが存在しない場合は、そのデータベースのデータを最初にストアするときに MongoDB によってデータベースが作成されます。
コレクションが存在しない場合、MongoDB は最初にそのコレクションにデータを保存する際にコレクションを作成します。
そのため、存在しないデータベース ( use <dbname>
) に切り替えて、次の操作を実行できます。
use myNewDB; db.myNewCollection1.insertOne( { x: 1 } ); db.myNewCollection2.createIndex( { a: 1 } );
db.collection.insertOne()
メソッドは、コレクションmyNewCollection1
がまだ存在しない場合はそれを作成します。db.collection.createIndex()
メソッドは、インデックスとコレクションmyNewCollection2
がまだ存在しない場合はそれを作成します。myNewDb
データベースが存在しない場合は、db.collection.createIndex()
メソッドまたはdb.collection.insertOne()
メソッドのいずれかによってmyNewDb
データベースが自動的に作成されます。
最大サイズやドキュメント検証ルールなど特定オプションを指定する場合は、db.createCollection()
メソッドを使用して明示的にコレクションを作成することもできます。
use myNewDB; db.createCollection("myNewCollection1");
コレクションスキーマを定義または変更するにはどうすればよいですか?
MongoDB ではコレクションのスキーマを指定する必要はありません。コレクション内のドキュメントはほぼ同種の構造を持つことが一般的ですが、これは必須ではありません。つまり、1つのコレクション内のドキュメントが同じフィールドセットを持つ必要はありません。フィールドのデータ型は、コレクション内のドキュメント間でも異なる場合があります。
コレクション内のドキュメントの構造を変更するには、ドキュメントを新しい構造にアップデートします。たとえば、新しいフィールドを追加したり、既存のフィールドを除いたり、フィールドの値を新しいタイプにアップデートしたりします。
注意
更新操作と挿入操作中にコレクションのドキュメント検証ルールを適用できます。
最大サイズの指定など、一部のコレクションプロパティは、コレクションの明示的な作成時に指定し、変更することができます。db.createCollection()
とcollMod
を参照してください。これらのプロパティを指定しない場合は、コレクションのデータが最初にストアされるときに MongoDB が新しいコレクションを作成するため、コレクションを明示的に作成する必要はありません。
MongoDB は SQL をサポートしていますか?
直接ではありません、いいえ。 ただし、MongoDB は独自の豊富な問い合わせ言語をサポートしています。 MongoDBの問い合わせ言語の例えについては、 「 MongoDB CRUD」を参照してください。
また、 MongoDB Connector for BIを使用して、SQL で MongoDB コレクションをクエリすることもできます。
SQL アプリケーションを MongoDB に移行することを検討している場合は、ベストプラクティスの移行ガイド、参照スキーマ、その他の役立つリソースが記載されたMongoDB アプリケーションモダナイゼーションガイドをダウンロードしてください。
MongoDB はトランザクションをサポートしていますか。
単一のドキュメントには、リレーショナルスキーマの別々の親子テーブルにまたがってモデル化される関連データを含めることができるため、MongoDB のアトミックな単一ドキュメント操作は、大半のアプリケーションのデータの完全性要件を満たすトランザクション セマンティクスをすでに提供しています。複数のサブドキュメントや配列の要素の更新を含め、1 つの操作で 1 つ以上のフィールドに書き込むことができます。MongoDB が提供する保証により、ドキュメントが更新されるときに完全な分離が保証されます。エラーが発生すると、操作がロールバックされ、クライアントはドキュメントの整合性のあるビューを受け取ることができます。
MongoDB は(単一または複数のコレクション内の)複数のドキュメントへの読み取りと書込みにアトミック性を必要とする状況で、レプリカセットやシャーディングされたクラスターでのトランザクションを含む分散トランザクションをサポートします。
詳細については、「トランザクション」を参照してください。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
MongoDB はキャッシングを取り扱いますか?
はい。MongoDB は最近使用したデータを RAM に保存します。クエリのインデックスを作成し、作業データセットが RAM に収まる場合、MongoDB はすべてのクエリをメモリから勧めます。
MongoDB は、同一のクエリのキャッシュされた結果を返すために、クエリ結果をキャッシュしません。
MongoDB とメモリ使用量の詳細については、 「WiredTiger とメモリ使用量」を参照してください。
MongoDB は SQL またはクエリインジェクションにどのように対処しますか?
BSON
クライアントは、MongoDB でクエリをアセンブルするときに、文字列ではなく BSON オブジェクトをビルドします。したがって、従来の SQL インジェクション攻撃は問題になりません。詳細といくつかのニュアンスについては、以下で説明します。
MongoDB はクエリをBSONオブジェクトとして表現します。通常、クライアントライブラリは、これらのオブジェクトをビルドするための便利でインジェクションのないプロセスを提供します。次の C++ の例えを考えてみます。
BSONObj my_query = BSON( "name" << a_name ); auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", my_query);
ここで、my_query
は{ name : "Joe"
}
のような値を持つことになる。たとえば、my_query
,
、:
、{
などの特殊文字が含まれている場合、クエリはどのドキュメントとも一致しません。たとえば、ユーザーはクエリを乗っ取って削除するに変換することはできません。
JavaScript
注意
JavaScript のサーバー側実行をすべて無効にすることができます。
mongod
インスタンスの場合は、コマンドラインで--noscripting
オプションを渡すか、構成ファイルでsecurity.javascriptEnabled
を false に設定します。mongos
インスタンスの場合は、コマンドラインで--noscripting
オプションを渡すか、構成ファイルでsecurity.javascriptEnabled
を false に設定します。
次の MongoDB 操作では、任意の JavaScript 式をサーバー上で直接実行できます。
このような場合、ユーザーが悪意のある JavaScript を送信しないように注意する必要があります。
幸いなことに、MongoDB では JavaScript を使用せずにほとんどの操作を表現できます。