レガシーmongo
shell との互換性の変更
項目一覧
このページでは、 mongosh
とレガシーmongo
shell の違いについて説明します。 ここにリストされている代替手段に加えて、 mongocomport mongo
レガシー shell 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
ヘルパー メソッド
次のshow
ヘルパー メソッドでは、操作に別の読み込み設定(read preference)が指定されている場合でも、常にprimaryPreferred
の読み込み設定(read preference)が使用されます。
show dbs
show databases
show collections
show 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 の両方を使用して同じコレクションに接続すると、データ型が不整合な状態で保存される可能性があります。
未定義の値
未定義のBSON型は 非推奨 です。 に未定義の JSmongosh
型のドキュメントを挿入しようとすると、配置はドキュメント内の未定義の値をBSON null 値に置き換えます。 を使用して未定義の値をデータベースに挿入する方法はサポートされていません。mongosh
例、次のコードを実行中して mongosh
にドキュメントを挿入する方法を考えてみましょう。
db.people.insertOne( { name : "Sally", age : undefined } )
このコードを mongosh
で実行すると、 シェルは次のドキュメントを挿入します。
{ name : "Sally", age : null }
mongosh
Goドライバーやレガシーの シェルなどの他のツールを使用して保存されたBSON未定義の値は、nullmongo
として表されます。
オブジェクト引用符の動作
mongosh
は出力でオブジェクト キーを引用せず、値に一重引用符を付けます。 キーとmongo
shell 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
レガシー
mongo
shell では無効
再試行可能な書込みを無効にするには、 --retryWrites=false
を使用します。
詳細については、--retryWrites
を参照してください。
レガシー出力
mongosh
shell は、レガシーのmongo
shell とは異なる出力を返します。 レガシーのmongo
shell と同様の方法で出力をフォーマットする必要があるスクリプトがある場合は、 EJSON.stringify()を使用してmongosh
出力を再フォーマットしてみてください。
詳細については、レガシーtojsononeline()
を参照してください。
コードスニペット
レガシーのmongo
shell ではコード スニペットの操作方法が異なります。
詳細については、「スニペットのヘルプを得る 」を参照してください。