このページでは、mongosh とレガシーmongo シェルの違いについて説明します。ここにリストされている代替手段に加えて、 mongocomat スニペットを使用してレガシーのmongo シェル API にアクセスできます。スニペットは実験的な機能です。詳しくは、「 スニペット 」を参照してください。
snippet install mongocompat
非推奨メソッド
次の shell メソッドは、 mongoshでは非推奨です。 代わりに、 Alternative Resources列にリストされているメソッドを使用してください。
非推奨のメソッド | 代替リソース |
|---|---|
| 集計ステージ: |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| が不要になりました。 「 セカンダリ ノードでの読み取り操作 」を参照してください。 |
読み込み設定(read preference)の動作
セカンダリ ノードでの読み取り操作
レガシーmongo shellを使用してセカンダリレプリカセット メンバーに直接接続する場合は、セカンダリ読み取りを有効にするために mongo.setReadPref() を実行する必要があります。
mongoshを使用してセカンダリレプリカセット メンバーに直接接続する場合、次のいずれかの読み込み設定( read preference )を指定すると、そのメンバーから読み取りを行うことができます。
読み込み設定(read preference)を指定するには、次のいずれかを使用できます。
ノードに接続するときの
readPreference接続stringオプション。Mongo.setReadPref()メソッド。
mongoshを使用してセカンダリレプリカセット メンバーに直接接続する場合、読み込み設定(read preference)がprimaryPreferred 、 secondary 、またはsecondaryPreferredに設定されている場合、 rs.secondaryOk()を実行する必要はありません。
ヘルパー メソッドを表示
次のshowヘルパー メソッドでは、操作に別の読み込み設定(read preference)が指定されている場合でも、常にprimaryPreferredの読み込み設定(read preference)が使用されます。
show dbsshow databasesshow collectionsshow tables
レガシーのmongo shell では、これらの操作は指定された読み込み設定(read preference)を使用します。
書込み (write preference) の動作
再試行可能な書込みは、 mongoshではデフォルトで有効になっています。 再試行可能な書込みは、レガシーmongo shell ではデフォルトで無効になっていました。 再試行可能な書込みを無効にするには、 --retryWrites=falseを使用します。
ObjectId メソッドと属性
これらのObjectId()メソッドは、 mongoshとレガシーのmongo shell では異なる動作をします。
メソッドまたは 属性 | mongo 動作 | mongosh 動作 |
|---|---|---|
| Returns a hexadecimal string: 6419ccfce40afaf9317567b7 | Undefined (Not available) |
| Returns the value of ObjectId.str:6419ccfce40afaf9317567b7 | Returns a formatted string: ObjectId("6419ccfce40afaf9317567b7") |
| Returns a formatted string: ObjectId("6419ccfce40afaf9317567b7") | Returns a hexadecimal formatted string: 6419ccfce40afaf9317567b7 |
Numeric Values
レガシーのmongo shell では数値はデフォルトでdoublesとして保存されていました。 mongoshでは、数値は 32 ビット整数Int32として保存されますが、値がInt32として保存できない場合はDoubleとして保存されます。
MongoDB Shell は、 mongo shell でサポートされている数値型を引き続きサポートします。 ただし、優先されるタイプは MongoDBドライバーとより整合するように更新されています。 詳細については、「 mongosh データ型 」を参照してください。
MongoDB Shell では、数値変数に推奨される型と、レガシーのmongo shell で推奨されている型が異なります。 mongoshの型は、MongoDB ドライバーで使用される型との整合性が優れています。
mongo タイプ | mongosh タイプ |
|---|---|
|
|
|
|
|
|
警告
mongoshとレガシーのmongo shell の両方を使用して同じコレクションに接続すると、データ型が不整合な状態で保存される可能性があります。
Tip
タイプの管理の詳細については、「スキーマ検証の概要 」を参照してください。
未定義の値
未定義のBSON型は 非推奨 です。mongosh に未定義のJavaScript型のドキュメントを挿入しようとすると、配置によりドキュメント内の未定義の値がBSON null 値に置き換えられます。 mongosh を使用して未定義の値をデータベースに挿入する方法はサポートされていません。
例、次のコードを実行中mongosh にドキュメントを挿入する方法を考えてみましょう。
db.people.insertOne( { name : "Sally", age : undefined } )
このコードを mongosh で実行すると、 シェル は次のドキュメントを挿入します。
{ name : "Sally", age : null }
mongosh Goドライバーやレガシーの シェルなどの他のツールを使用して保存されたBSON未定義の値は、nullmongo として表されます。
オブジェクト引用符の動作
mongosh は出力でオブジェクト キーを引用せず、値に一重引用符を付けます。 キーとmongoshell string値の両方を 引用符で囲むレガシーdouble mongosh --evalの出力を再生するには、 EJSON.stringify() とともに使用します。
たとえば、次のコマンドは、 double引用符とインデントを含む test データベースの sales コレクション内のアイテムを返します。
mongosh --eval "EJSON.stringify(db.sales.findOne().toArray(), null, 2)"
出力は、次のようになります。
{ "_id": { "$oid": "64da90c1175f5091debcab26" }, "custId": 345, "purchaseDate": { "$date": "2023-07-04T00:00:00Z" }, "quantity": 4, "cost": { "$numberDecimal": "100.60" } }
データベース呼び出しの制限
次のコンテキストでは、データベースクエリの結果を渡すことができません。
クラスコンストラクタ関数
非同期ジェネレーター関数
配列上の
.sort()へのコールバッククラス内の JavaScript セッター
データベース呼び出しの結果にアクセスするには、非同期関数、非同期ジェネレーター関数、または .map() を使用します。
コンストラクター
次のコンストラクターは動作しません。
// This code will fail class FindResults { constructor() { this.value = db.students.find(); } } // This code will fail function listEntries() { return db.students.find(); } class FindResults { constructor() { this.value = listEntries(); } }
代わりに、 async関数を使用してください。
class FindResults { constructor() { this.value = ( async() => { return db.students.find(); } )(); } }
注意
非同期 JavaScript を操作する代わりに、クラス内でデータベース操作を実行するメソッドを作成することもできます。
class FindResults { constructor() { } init() { this.value = db.students.find(); } }
このクラスを使用するには、まずクラス インスタンスを作成し、次に.init()メソッドを呼び出します。
ジェネレーター関数
次のジェネレーター関数は動作しません。
// This code will fail function* FindResults() { yield db.students.findOne(); } // This code will fail function listEntries() { return db.students.findOne(); } function* findResults() { yield listEntries(); }
代わりにasync generator functionを使用してください。
function listEntries() { return db.students.findOne(); } async function* findResults() { yield listEntries(); }
配列ソート
次の配列ソートは機能しません。
// This code will fail db.getCollectionNames().sort( ( collectionOne, collectionTwo ) => { return db[ collectionOne ].estimatedDocumentCount() - db[ collectionOne ].estimatedDocumentCount() ) } );
代わりに.map()を使用してください。
db.getCollectionNames().map( collectionName => { return { collectionName, size: db[ collectionName ].estimatedDocumentCount() }; } ).sort( ( collectionOne, collectionTwo ) => { return collectionOne.size - collectionTwo.size; } ).map( collection => collection.collectionName);
この配列ソートのアプローチは、サポートされていない同等のコードよりもパフォーマンスが高いことが多い。
JavaScript セッター
次の JavaScript 設定は機能しません。
// This code will fail class TestClass { value = 1; get property() { return this.value; } // does not work: set property(value) { this.value = db.test.findOne({ value }); } }
コマンドの例外
出力に{ ok: 0 }が含まれているコマンドの場合、 mongoshは一貫した例外を返し、サーバーの未加工の出力を省略します。 レガシーのmongo shell は、コマンドごとに異なる出力を返します。
詳細については、「コマンドを実行 」を参照してください。
shell 構成
レガシーのmongo shell は.mongorc.jsという名前の構成ファイルを使用します。
mongoshが起動時に.mongorc.jsを見つけても.mongoshrc.jsが見つからない場合、 mongoshはレガシーの.mongorc.jsファイルをロードせず、 .mongorc.jsの名前を.mongoshrc.jsに変更する必要があると示します。
詳細については、 .mongoshrc構成ファイルを参照してください。
データ型
MongoDB は、 JSON では利用できない追加のデータ型をサポートする BSON を使用してデータを保存します。mongosh shell は、レガシーのmongo shell よりもドライバーのデータ型のサポートが優れています。
詳細については、「データ型 」を参照してください。
メソッド
レガシーのmongo shell は、 load()メソッドでスクリプトのファイル名またはディレクトリにアクセスできません。
詳細については、 load() を参照してください。
再試行可能な書き込み
デフォルトでは、再試行可能な書込みは次のとおりです。
で有効
mongoshレガシー
mongoshell では無効
再試行可能な書込みを無効にするには、 --retryWrites=falseを使用します。
詳細については、--retryWrites を参照してください。
レガシー出力
mongosh shell は、レガシーのmongo shell とは異なる出力を返します。 レガシーのmongo shell と同様の方法で出力をフォーマットする必要があるスクリプトがある場合は、 EJSON.stringify()を使用してmongosh出力を再フォーマットしてみてください。
詳細については、「 レガシー tojsononeline() 」を参照してください。
コードスニペット
レガシーのmongo shell ではコード スニペットの操作方法が異なります。
詳細については、「スニペットのヘルプを得る 」を参照してください。