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

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

$set演算子で全ドキュメントに新フィールドを追加

MongoDBのコレクションに格納されたすべてのドキュメントへ、新しいフィールドを一括で追加したいケースはよくあります。そのような場合には、update()メソッドと$set演算子を組み合わせて使用します。ポイントは次の3つです。

  • 検索条件を空のオブジェクト{}にして、すべてのドキュメントを対象にする
  • $set演算子で追加したいフィールド名と値を指定する
  • 第4引数(multiオプション)をtrueにして、複数ドキュメントの一括更新を有効にする

基本構文は以下のとおりです。

db.yourCollectionName.update({}, { $set: {"yourFieldName": yourValue} }, false, true);

補足: MongoDB 4.2以降では、旧形式のupdate()(upsert/multiフラグ付き)は非推奨となっています。現在のバージョンでは、複数ドキュメントの更新に特化したupdateMany()を使うのが推奨されており、記述もよりシンプルになります。

db.yourCollectionName.updateMany({}, { $set: { "yourFieldName": yourValue } });

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

動作を確認するため、学生情報を持つコレクションを作成して、いくつかドキュメントを挿入してみましょう。以下のクエリを実行します。

> db.addNewFieldToEveryDocument.insertOne({"StudentName":"John","StudentAddress":"US"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6efc0b6fd07954a48906ae")
}
> db.addNewFieldToEveryDocument.insertOne({"StudentName":"David","StudentAddress":"UK"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6efc0b6fd07954a48906af")
}
> db.addNewFieldToEveryDocument.insertOne({"StudentName":"Carol","StudentAddress":"UK"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6efc0b6fd07954a48906b0")
}
> db.addNewFieldToEveryDocument.insertOne({"StudentName":"Bob","StudentAddress":"US"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6efc0b6fd07954a48906b1")
}

挿入したドキュメントの確認

find()メソッドにpretty()を組み合わせると、整形された読みやすい形式で全ドキュメントを表示できます。

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

実行結果は以下のとおりです。現時点では、各ドキュメントには「StudentName」と「StudentAddress」しか存在していません。

{
    "_id" : ObjectId("5c6efc0b6fd07954a48906ae"),
    "StudentName" : "John",
    "StudentAddress" : "US"
}
{
    "_id" : ObjectId("5c6efc0b6fd07954a48906af"),
    "StudentName" : "David",
    "StudentAddress" : "UK"
}
{
    "_id" : ObjectId("5c6efc0b6fd07954a48906b0"),
    "StudentName" : "Carol",
    "StudentAddress" : "UK"
}
{
    "_id" : ObjectId("5c6efc0b6fd07954a48906b1"),
    "StudentName" : "Bob",
    "StudentAddress" : "US"
}

新しいフィールドの一括追加を実行

それでは、すべてのドキュメントに「StudentAge: 24」という新しいフィールドを追加してみます。実行するクエリは次のとおりです。

> db.addNewFieldToEveryDocument.update({}, { $set: {"StudentAge": 24} }, false, true);
WriteResult({ "nMatched" : 4, "nUpserted" : 0, "nModified" : 4 })

上記のように、すべてのドキュメントに新しいフィールド「StudentAge: 24」を追加しました。実行結果のnMatched: 4は4件のドキュメントが条件に一致したこと、nModified: 4は4件すべてが正常に更新されたことを示しています。

更新結果の確認

最後に、find()メソッドで再度ドキュメントを表示し、新しいフィールドがすべてのドキュメントに正しく追加されているか確認しましょう。

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

出力結果は以下のとおりです。

{
    "_id" : ObjectId("5c6efc0b6fd07954a48906ae"),
    "StudentName" : "John",
    "StudentAddress" : "US",
    "StudentAge" : 24
}
{
    "_id" : ObjectId("5c6efc0b6fd07954a48906af"),
    "StudentName" : "David",
    "StudentAddress" : "UK",
    "StudentAge" : 24
}
{
    "_id" : ObjectId("5c6efc0b6fd07954a48906b0"),
    "StudentName" : "Carol",
    "StudentAddress" : "UK",
    "StudentAge" : 24
}
{
    "_id" : ObjectId("5c6efc0b6fd07954a48906b1"),
    "StudentName" : "Bob",
    "StudentAddress" : "US",
    "StudentAge" : 24
}

すべてのドキュメントに「StudentAge: 24」が追加されていることが確認できました。

まとめ

コレクション全体に新しいフィールドを追加するには、$set演算子を使い、検索条件を空にしたうえでmultiオプション(またはupdateMany())で一括更新を行います。$setは指定したフィールドのみを追加・更新し、既存のデータには影響しないため、既存アプリケーションへの影響を最小限に抑えながら、安全にスキーマを拡張できます。

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

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

  2. 既存のMongoDBドキュメントにリストやオブジェクト型のフィールドを追加する方法

    既存のMongoDBドキュメントに、オブジェクト型や配列(リスト)型など特定のデータ型を持つ新しいフィールドを追加したい場合、$set 演算子を使用します。$set は指定したフィールドが存在しない場合は新しく作成し、すでに存在する場合は値を更新してくれるため、フィールドの追加にも最適です。1. コレクションとドキュメントの作成まず、insertOne() メソッドを使ってサンプルのコレクションを作成します。> db.demo732.insertOne({_id:1,Language:"English"}); { "acknowledged" :