Docs Menu
Docs Home
/
MongoDB Shell

スクリプトの書き込み (write)

項目一覧

  • 互換性
  • JavaScript ファイルの実行
  • mongosh 内からスクリプト実行
  • コマンドラインからスクリプトを実行
  • 認証を使用してコマンドラインからスクリプトを実行
  • エラー発生時のスクリプトの終了
  • 構成ファイルからコードを実行
  • JavaScript コードの実行
  • MongoDB コードの実行
  • JavaScript と MongoDB コードの実行
  • 新しい接続を開く
  • ローカルの MongoDB インスタンスへの接続
  • Atlas 配置への接続
  • アクセス制御を強制する MongoDBインスタンスへの接続
  • connect() を使用して MongoDB インスタンスに接続
  • 接続に関する考慮事項

MongoDB Shell のスクリプトを記述して、MongoDB のデータ変更や管理操作を実行できます。より簡単に配布と管理を行えるよう、スクリプトを スニペットとしてパッケージ化することもできます。

このチュートリアルでは、MongoDB Shell と JavaScript を組み合わせて MongoDB にアクセスする方法を紹介します。

MongoDB シェルのスクリプトは、次の環境でホストされる配置用に記述できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる、MongoDB の自己管理型バージョン

MongoDB Atlas でホストされている配置向けに MongoDB Shell を使用する方法について詳しくは、「mongosh 経由での接続」を参照してください。

load() メソッドを使用して、MongoDB Shell 内から .js ファイルを実行できます。

load () メソッドは相対パスと絶対パスを受け入れます。MongoDB Shell の現在の作業ディレクトリが /data/db で、connect-and-insert.js/data/db/scripts ディレクトリにある場合、MongoDB Shell 内の次の呼び出しは同等です。

load( "scripts/connect-and-insert.js" )
load( "/data/db/scripts/connect-and-insert.js" )

次の例では、以下のようなスクリプトを作成して実行します。

  • デフォルト ポートで実行されているローカル インスタンスに接続します。

  • myDatabaseデータベースに接続します。

  • movies コレクションにサンプル ドキュメントを入力します。

  1. 次の内容で connect-and-insert.js という名前のファイルを作成します。

    db = connect( 'mongodb://localhost/myDatabase' );
    db.movies.insertMany( [
    {
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ] )
  2. connect-and-insert.js ファイルをロードして実行するには、mongosh を使用して配置に接続し、次のコマンドを実行します。

    load( "connect-and-insert.js" )
  3. ドキュメントが正しくロードされたことを確認するには、myDatabase コレクションを使用して movies コレクションをクエリします。

    use myDatabase
    db.movies.find()

注意

load() メソッドには検索パスがありません。ターゲット スクリプトが現在の作業ディレクトリまたは指定された絶対パスにない場合、MongoDB Shell はファイルにアクセスできません。

mongosh を使用すると、mongosh コンソールに入らずにコマンドラインからスクリプトを実行できます。

ファイル名を指定するには、--file パラメーターまたは -f パラメーターを使用します。--file パラメーターや -f パラメーターに加えて、接続情報を指定する必要がある場合もあります。

Tip

パラメーター フラグを使わずにファイル名を mongosh に渡すと、他のコマンドライン引数がある場合に接続が失敗する可能性があります。

ファイル名を渡すには、常に --file または -f を使用します。

次の例では、スクリプトを作成し、コマンドラインから実行します。

  • loadMovies.js は、insertMany() を使用してローカルの MongodDB インスタンスを更新します。

  • queryMovies.js は、db.collection.find() を使用して更新を検証します。

  1. このスクリプトをコピーして、loadMovies.js として保存します。

    db = connect( 'mongodb://localhost/films' );
    db.movies.insertMany( [
    {
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ] )

    Tip

    強調表示された行の接続文字列を検証します。MongoDB インスタンスが localhost:27017 で実行中でない場合は、接続文字列を編集する必要があります。

    たとえば、次の接続文字列は localhost のポート 27500 に接続します。

    db = connect( 'mongodb://localhost:27500/films' );
  2. このスクリプトをコピーして、queryMovies.js として保存します。

    db = connect( 'mongodb://localhost/films' );
    printjson( db.movies.find( {} ) );
  3. コマンドラインからスクリプトを実行します。

    mongosh --file loadMovies.js --file queryMovies.js
  4. 出力を確認します。

    Loading file: loadMovies.js
    Loading file: queryMovies.js
    [
    {
    _id: ObjectId("616f1b8092dbee425b661117"),
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    _id: ObjectId("616f1b8092dbee425b661118"),
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    _id: ObjectId("616f1b8092dbee425b661119"),
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ]

    db.collection.find() コマンドの出力は、movies コレクションが更新されたことを示しています。

    Tip

    出力を表示するには、printjson() を使用して db.collection.find() を呼び出します。

    printjson( db.movies.find( {} ) ) ;

認証が必要なリモート mongod インスタンスに対してスクリプトを実行するには、ファイル名に加えて、接続と認証の詳細を指定します。

以下に例を挙げます。

mongosh --host 172.17.0.3 --port 27500 --username filmFan --password superSecret --file loadMovies.js

オプションの短縮形を指定することもできます。

mongosh --host 172.17.0.3 --port 27500 -u filmFan -p superSecret -f loadMovies.js

Tip

bashzsh などのシェルでは、コマンドをスペースで始めると、コマンド履歴に保存されません。これによって、コマンドラインでパスワードを入力する場合の露出を最小限に抑えられます。

例外が発生したり予期しない結果が発生した場合、たいていは実行中のスクリプトを終了した方が良いです。スクリプトの特定の時点で終了することで、不要なコードが実行されたり、予期しない結果になったりするのを防げます。

スクリプトを終了するには、exit(<code>) メソッドを呼び出します。<code> はユーザーが指定した任意の値です。

ベストプラクティスとして、コードを try - catch で囲み、catch ブロックの exit メソッドを呼び出します。同様に、クエリやコマンドの結果を確認するには、if - else ステートメントを追加し、結果が期待どおりでない場合は exit メソッドを呼び出します。

スタートアップ時に、mongoshHOME ディレクトリで .mongoshrc.js という名前の JavaScript ファイルを確認します。このファイルが見つかった場合、mongosh はプロンプトを初めて表示する前に .mongoshrc.js の内容を読み取ります。

Tip

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

mongosh プロンプトを更新して行番号を表示するには、次のコードを <your-home-directory>/.mongoshrc.js に追加します。

let cmdCount = 1;
prompt = function() {
return (cmdCount++) + "> ";
}

プロンプトは次のようになります。

1> show collections
2> use test
3>

mongosh クライアントがデータベースに接続したときのログを作成するには、次のコードを <your-home-directory>/.mongoshrc.js に追加します。

db.clientConnections.insertOne( { connectTime: ISODate() } )

データベースに接続するたびに、MongoDB サーバーは次のようなドキュメントを clientConnections コレクションに追加します。

{
_id: ObjectId("61d4bbf0fa4c85f53418070f"),
connectTime: ISODate("2022-01-04T21:28:16.367Z")
}

現在のデータベース名は、デフォルトの mongosh プロンプトの一部です。データベースとホスト名を表示するようにプロンプトを再フォーマットするには、次のような関数を使用します。

{
const hostnameSymbol = Symbol('hostname');
prompt = () => {
if (!db[hostnameSymbol])
db[hostnameSymbol] = db.serverStatus().host;
return `${db.getName()}@${db[hostnameSymbol]}> `;
};
}

プロンプトは次のようになります。

admin@centos0722:27502>

MongoDB Shell または JavaScript ファイルから、Mongo() メソッドを使用してデータベース接続をインスタンス化できます。

new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)

注意

MongoDB Shell は、Mongo() メソッドを使用した ClientSideFieldLevelEncryptionOptions ドキュメントをサポートしません。

デフォルトポートの localhost で実行中の MongoDB インスタンスを考えてみましょう。

次の例:

  • インスタンスへの新しい接続をインスタンス化します。

  • Mongo.getDB() メソッドを使用して、グローバル db 変数を myDatabase に設定します。

conn = Mongo();
db = conn.getDB("myDatabase");

MongoDB Atlas でホストされている配置に接続するには、Atlas 接続文字列を使用して mongosh コマンドを実行します。例を以下に示します。

mongosh "mongodb+srv://YOUR_CLUSTER_NAME.YOUR_HASH.mongodb.net/" --apiVersion YOUR_API_VERSION --username YOUR_USERNAME

配置への接続を確立したら、MongoDB Shell から直接データベース接続をインスタンス化できます。以下の例では、次を行います。

  • db.getMongo() メソッドを使用して、現在の配置への接続をインスタンス化します。

  • Mongo.getDB() メソッドを使用して、グローバル db 変数を myDatabase に設定します。

conn = db.getMongo()
db = conn.getDB("myDatabase");

アクセス制御を適用する MongoDB インスタンスに接続するには、接続文字列に認証情報を含める必要があります。

以下のコマンドは、次の MongoDB インスタンスに接続します。

  • デフォルトポートの localhost で実行中、かつ

  • SCRAM を使用して保護されています。

conn = Mongo("mongodb://<username>:<password>@localhost:27017/<authDB>");

注意

MongoDB Shell は、コマンド履歴ログから認証情報を削除します。

connect() メソッドを使用して MongoDB インスタンスに接続することもできます。

以下のコマンドでは、次を行います。

  • デフォルト以外のポート 27020 を使用して localhost で実行されているMongoDBインスタンスに接続します。

  • グローバル db 変数を設定します。

db = connect("localhost:27020/myDatabase");

スクリプトを作成するときは、移植性と動作環境を考慮してください。

接続の詳細がスクリプトに含まれている場合、次のようになります。

  • コマンドラインで接続情報を指定する必要がありません。

  • --nodb パラメーターを使用する必要があります。

localhost:27500 で実行されている mongod インスタンスについて考えてみます。

次のスクリプトは、ユーザー数を出力します。コードをコピーして、getUserCount.js として保存します。

db = connect( "localhost:27500/admin" );˘
printjson( db.system.users.countDocuments() );

getUserCount.js を実行します。

mongosh --nodb --file getUserCount.js
  • mongosh のデフォルトはポート 27170 です。

  • mongod はポート 27500 で実行されています。

  • --nodb パラメーターは、最初にmongod インスタンスに接続せずにスクリプトを実行するよう mongosh に指示します。

強調表示された行は正しいですが、mongosh がローカル インスタンスに接続できないため、getUserCount.js は --nodb なしでは実行されません。--nodb を使用すると、mongoshgetUserCount.js を実行し、強調表示された情報を使用して接続します。

スクリプト内で接続情報を指定すると便利ですが、移植性が低下します。リモートインスタンスまたは別のポートで実行中のインスタンスで実行するためには、getUserCount.js スクリプトを更新する必要があります。

移植性を高めるには、db.getSiblingDB() を使用して、コマンドラインで接続情報を指定します。

次のスクリプトは、特定の接続詳細持たないため、getUserCount.js よりも移植性が高くなります。コードをコピーして、portableGetUserCount.js として保存します。

db = db.getSiblingDB( "admin" );
printjson( db.system.users.countDocuments() );

portableGetUserCount.jsを実行するには、次のようにコマンドラインでホストとポートを指定します。

mongosh --host 172.17.0.3 --port 27500 --file portableGetUserCount.js

別のホストまたはポートで portableGetUserCount.js を実行するには、コマンドラインで接続の詳細を変更します。getUserCount.js とは異なり、portableGetUserCount.js を実行するためにスクリプトを編集する必要はありません。

戻る

クライアントサイドのフィールド レベル暗号化