スクリプトの書き込み (write)
項目一覧
MongoDB Shell のスクリプトを記述して、MongoDB のデータ変更や管理操作を実行できます。より簡単に配布と管理を行えるよう、スクリプトを スニペットとしてパッケージ化することもできます。
このチュートリアルでは、MongoDB Shell と JavaScript を組み合わせて MongoDB にアクセスする方法を紹介します。
互換性
MongoDB シェルのスクリプトは、次の環境でホストされる配置用に記述できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる、MongoDB の自己管理型バージョン
MongoDB Atlas でホストされている配置向けに MongoDB Shell を使用する方法について詳しくは、「mongosh 経由での接続」を参照してください。
JavaScript ファイルの実行
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
コレクションにサンプル ドキュメントを入力します。
次の内容で
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' ] } ] ) connect-and-insert.js
ファイルをロードして実行するには、mongosh
を使用して配置に接続し、次のコマンドを実行します。load( "connect-and-insert.js" ) ドキュメントが正しくロードされたことを確認するには、
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()
を使用して更新を検証します。
このスクリプトをコピーして、
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' ); このスクリプトをコピーして、
queryMovies.js
として保存します。db = connect( 'mongodb://localhost/films' ); printjson( db.movies.find( {} ) ); コマンドラインからスクリプトを実行します。
mongosh --file loadMovies.js --file queryMovies.js 出力を確認します。
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
bash
や zsh
などのシェルでは、コマンドをスペースで始めると、コマンド履歴に保存されません。これによって、コマンドラインでパスワードを入力する場合の露出を最小限に抑えられます。
エラー発生時のスクリプトの終了
例外が発生したり予期しない結果が発生した場合、たいていは実行中のスクリプトを終了した方が良いです。スクリプトの特定の時点で終了することで、不要なコードが実行されたり、予期しない結果になったりするのを防げます。
スクリプトを終了するには、exit(<code>)
メソッドを呼び出します。<code>
はユーザーが指定した任意の値です。
ベストプラクティスとして、コードを try - catch
で囲み、catch
ブロックの exit
メソッドを呼び出します。同様に、クエリやコマンドの結果を確認するには、if - else
ステートメントを追加し、結果が期待どおりでない場合は exit
メソッドを呼び出します。
構成ファイルからコードを実行
スタートアップ時に、mongosh
は HOME
ディレクトリで .mongoshrc.js
という名前の JavaScript ファイルを確認します。このファイルが見つかった場合、mongosh
はプロンプトを初めて表示する前に .mongoshrc.js
の内容を読み取ります。
JavaScript コードの実行
mongosh
プロンプトを更新して行番号を表示するには、次のコードを <your-home-directory>/.mongoshrc.js
に追加します。
let cmdCount = 1; prompt = function() { return (cmdCount++) + "> "; }
プロンプトは次のようになります。
1> show collections 2> use test 3>
MongoDB コードの実行
mongosh
クライアントがデータベースに接続したときのログを作成するには、次のコードを <your-home-directory>/.mongoshrc.js
に追加します。
db.clientConnections.insertOne( { connectTime: ISODate() } )
データベースに接続するたびに、MongoDB サーバーは次のようなドキュメントを clientConnections
コレクションに追加します。
{ _id: ObjectId("61d4bbf0fa4c85f53418070f"), connectTime: ISODate("2022-01-04T21:28:16.367Z") }
JavaScript と MongoDB コードの実行
現在のデータベース名は、デフォルトの 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 ドキュメントをサポートしません。
ローカルの MongoDB インスタンスへの接続
デフォルトポートの localhost で実行中の MongoDB インスタンスを考えてみましょう。
次の例:
インスタンスへの新しい接続をインスタンス化します。
Mongo.getDB()
メソッドを使用して、グローバルdb
変数をmyDatabase
に設定します。
conn = Mongo(); db = conn.getDB("myDatabase");
Atlas 配置への接続
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 インスタンスに接続するには、接続文字列に認証情報を含める必要があります。
以下のコマンドは、次の MongoDB インスタンスに接続します。
デフォルトポートの
localhost
で実行中、かつSCRAM を使用して保護されています。
conn = Mongo("mongodb://<username>:<password>@localhost:27017/<authDB>");
connect()
を使った MongoDB インスタンスへの接続
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
を使用すると、mongosh
は getUserCount.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
を実行するためにスクリプトを編集する必要はありません。