MongoDBで単純なフィールドをオブジェクトに変更するクエリ($rename演算子の使い方)
MongoDBで単純なフィールドをオブジェクト(ネストされたフィールド)に変更するには?
MongoDBで既存の単純なフィールドをオブジェクト形式(ネストされたドキュメント)へ変更したい場合には、更新演算子の$renameを使用します。$renameは本来フィールド名を変更するための演算子ですが、移動先のパスにドット表記(「親.子」の形式)を指定することで、親オブジェクトが自動的に作成され、フィールドをその内部へ移動させることができます。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.changeSimpleFieldDemo.insertOne({'StudentMarks':58,'StudentSubject':'MySQL'});
{
'acknowledged' : true,
'insertedId' : ObjectId('5e0847a825ddae1f53b62205')
}2. ドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.changeSimpleFieldDemo.find().pretty();
実行すると、次のような出力が得られます。
{ '_id' : ObjectId('5e0847a825ddae1f53b62205'), 'StudentMarks' : 58, 'StudentSubject' : 'MySQL' }3. フィールドをオブジェクトに変更するクエリ
ここからが本題です。$renameの移動先にドット表記を指定すると、単純なフィールドをオブジェクト内のフィールドへと変換できます。次の例では、「StudentMarks」と「StudentSubject」を「Student」オブジェクトの中の「Marks」「Subject」へ移動しています。第2引数のオプションでmulti:true(またはupdateManyの使用)を指定すれば、コレクション内のすべてのドキュメントに対して一括処理が可能です。
> db.changeSimpleFieldDemo.updateMany(
... {},
... { $rename: {
... 'StudentMarks': 'Student.Marks',
... 'StudentSubject': 'Student.Subject'
... }}
... );
{ 'acknowledged' : true, 'matchedCount' : 1, 'modifiedCount' : 1 }なお、一時的なフィールド名(たとえば「obj」)を経由して段階的にリネームする方法もあります。その場合は、まず対象フィールドを「obj」へリネームし、その後「Student.Marks」のようなドット表記のパス宛てにもう一度$renameを実行します。目的の構造が決まっているなら、上記のように直接ドット表記へリネームする方がシンプルです。
4. 変更結果の確認
もう一度find()を実行して、変更後のドキュメントを確認しましょう。
{
'_id' : ObjectId('5e0847a825ddae1f53b62205'),
'Student' : {
'Marks' : 58,
'Subject' : 'MySQL'
}
}このように、$renameとドット表記を組み合わせるだけで、単純なフィールドを簡単にオブジェクトへ再構成できます。スキーマ設計の見直しやデータ構造のリファクタリングの際に、ぜひ活用してください。
-
MongoDBでフィールド名を変更する方法:$projectを使った手順を解説
MongoDBでフィールド名を変更するには?MongoDBでは、集計パイプラインの $project ステージを使用することで、既存のフィールド名を別の名前に変更して出力することができます。ここでは、実際にコレクションを作成し、「Name」というフィールドを「FullName」に変更する手順を順番に見ていきましょう。1. サンプルコレクションの作成まずは、insertOne() メソッドを使ってドキュメントを含むコレクションを作成します。> db.demo517.insertOne({Name:Chris Brown});{ acknowledged : true, inse
-
MongoDBでグループ化をオブジェクトに投影し、点数フィールドのみを表示する方法
MongoDBでは、配列形式のドキュメントデータをJavaScriptのオブジェクト形式へ変換(投影)できます。本記事では、科目名と点数を含むドキュメントをグループ化し、科目名をキー・点数のみを値とするオブジェクトを作成する手順を解説します。サンプルドキュメントの作成まず、科目名(SubjectName)と点数(Marks)を含むドキュメントを配列として作成します。> var document = [... { SubjectName : MySQL, Marks : 78 },... { SubjectName :