MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

大規模なMongoDBコレクションの各ドキュメントに新しいプロパティを追加する方法

大規模なMongoDBコレクションの各ドキュメントに新しいプロパティを追加する方法

大規模なコレクションのすべてのドキュメントに新しいプロパティを追加したい場合は、updateコマンドforEach()を組み合わせることで実現できます。この記事では、実際にコレクションを作成し、各ドキュメントへ新しいプロパティを追加する手順を順番に解説します。

1. サンプルコレクションの作成

まず、テスト用のコレクションに複数のドキュメントを挿入します。

> db.addingNewPropertyDemo.insertOne({"StudentName":"John","StudentAge":23,"CountryName":"US"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca1e61866324ffac2a7dc56")
}
> db.addingNewPropertyDemo.insertOne({"StudentName":"David","StudentAge":21,"CountryName":"AUS"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca1e62366324ffac2a7dc57")
}
> db.addingNewPropertyDemo.insertOne({"StudentName":"Bob","StudentAge":21,"CountryName":"UK"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca1e62d66324ffac2a7dc58")
}

2. 作成したドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.addingNewPropertyDemo.find().pretty();

実行すると、次のような出力が得られます。

{
   "_id" : ObjectId("5ca1e61866324ffac2a7dc56"),
   "StudentName" : "John",
   "StudentAge" : 23,
   "CountryName" : "US"
}
{
   "_id" : ObjectId("5ca1e62366324ffac2a7dc57"),
   "StudentName" : "David",
   "StudentAge" : 21,
   "CountryName" : "AUS"
}
{
   "_id" : ObjectId("5ca1e62d66324ffac2a7dc58"),
   "StudentName" : "Bob",
   "StudentAge" : 21,
   "CountryName" : "UK"
}

3. forEach()で各ドキュメントに新しいプロパティを追加する

ここからが本題です。find()で取得した各ドキュメントに対してforEach()でループ処理を行い、その中でupdateを実行することで、すべてのドキュメントに新しいプロパティを追加できます。以下の例では、StudentNameの値を大文字に変換した「StudentNameInUpperCase」という新しいプロパティを追加しています。

> db.addingNewPropertyDemo.find().forEach(function(data){
    db.addingNewPropertyDemo.update(
        { _id: data._id },
        { $set: { StudentNameInUpperCase: data.StudentName.toUpperCase() } }
    )
});

この処理のポイントは次のとおりです。

  • find()でコレクション内の全ドキュメントを取得する
  • forEach()で1件ずつ取り出し、ドキュメントの_idをキーにupdateを実行する
  • $set演算子を使うことで、既存のフィールドを壊さずに新しいプロパティだけを追加できる

4. 追加結果の確認

本当に新しいプロパティが追加されたか、もう一度find()で確認してみましょう。

> db.addingNewPropertyDemo.find().pretty();

実行結果には、新しく追加されたプロパティも表示されます。

{
   "_id" : ObjectId("5ca1e61866324ffac2a7dc56"),
   "StudentName" : "John",
   "StudentAge" : 23,
   "CountryName" : "US",
   "StudentNameInUpperCase" : "JOHN"
}
{
   "_id" : ObjectId("5ca1e62366324ffac2a7dc57"),
   "StudentName" : "David",
   "StudentAge" : 21,
   "CountryName" : "AUS",
   "StudentNameInUpperCase" : "DAVID"
}
{
   "_id" : ObjectId("5ca1e62d66324ffac2a7dc58"),
   "StudentName" : "Bob",
   "StudentAge" : 21,
   "CountryName" : "UK",
   "StudentNameInUpperCase" : "BOB"
}

出力を見ると、すべてのドキュメントに「StudentNameInUpperCase」プロパティが追加されていることが確認できます。

補足:より効率的な一括更新の方法

MongoDB 3.2以降では、単純に同じ値を全ドキュメントへ設定するだけであれば、updateMany()を使うほうが効率的です。さらにMongoDB 4.2以降では、集計パイプラインを利用した更新が可能になったため、既存フィールドの値を加工しながら新しいプロパティを追加することも、サーバー側の処理だけで実現できます。

> db.addingNewPropertyDemo.updateMany(
    {},
    [ { $set: { StudentNameInUpperCase: { $toUpper: "$StudentName" } } } ]
);

大規模なコレクションを扱う場合は、forEach()でのループ更新よりも、このような一括更新の方がパフォーマンス面で有利です。用途やMongoDBのバージョンに応じて、最適な方法を選択してください。

  1. MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法

    MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。まずは、サンプルとなるコレクションとドキュメントを作成してみましょう。サンプルコレクションの作成insertOne()メソッドを使用して、ドキュメントを1件ずつ挿入します。> db.demo712.insertOne({Name:John}); { acknowledged : true, insertedId : ObjectId(5ea85f675d33e20ed1

  2. MongoDBでコレクション内のドキュメントの各フィールドを数式を使って更新する方法

    コレクション内のドキュメントの各フィールドを数式(計算式)で一括更新したい場合は、MongoDBの update() メソッドに $mul 演算子と全位置演算子 $[] を組み合わせて使用します。本記事では、配列内のすべての要素に対して特定のフィールドの値を乗算で更新する具体的な手順を解説します。サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュメントを含むコレクションを作成します。> db.demo749.insertOne({details:[{id:1,a:10},{id:2,a:5},{id:3,a:20}]}); { acknowledge