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

Tahseen Tauseef 2024年2月15日
  1. MongoDB の $set 演算子
  2. MongoDB の $setOnInsert 演算子
  3. MongoDB コレクションのドキュメントに新しいフィールドを追加する
MongoDB コレクション内のすべてのドキュメントに新しいフィールドを追加する

この記事では、$set および $setOnInsert 操作について説明します。 さらに、MongoDB のコレクションにフィールドを追加する問題についても、これら 2つの演算子を使用して簡単に説明します。

MongoDB の $set 演算子

$set 演算子は、フィールドの値を指定された値に変更します。 $set 演算子式は、{ $set: { <field1>: <value1>, ... } } のようになります。

埋め込みテキストまたは配列で <field> を定義するには、ドット表記を使用します。

$set 演算子の動作

更新演算子は、MongoDB 5.0 以降、文字列ベースの名前を持つドキュメント フィールドを辞書順に処理します。 数値名のフィールドは、番号順に処理されます。

フィールドがまだ存在しない場合、新しいフィールドがタイプの制限に違反しない限り、$set は要求された値でフィールドを作成します。 存在しないフィールドにドット パスを指定すると、$set は必要に応じて埋め込みドキュメントを構築し、ドット パスを完成させます。

複数のフィールドと値のペアを指定すると、$set は各フィールドを更新または作成します。

MongoDB 5.0 で空のオペランド式 ({}) で $set のような更新演算子を使用すると、mongod はエラーをスローしなくなりました。 空の更新による変更はなく、oplog レコードは生成されません (操作がノーオペレーションであることを意味します)。

たとえば、clothes コレクションを作成してみましょう。

db.clothes.insertOne(
   {
     _id: 100,
     quantity: 250,
     instock: true,
     reorder: false,
     details: { model: "14RR", make: "Clothes" },
     tags: [ "apparel", "clothing" ],
     ratings: [ { by: "Customer127", rating: 5 } ]
   }
)

最上位フィールドの設定

次の手順では、$set 演算子を使用して、100 に等しい基準 _id を満たすドキュメントの quantitydetails、および tags フィールドの値を変更します。

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        quantity: 400,
        details: { model: "2600", make: "Fashionables" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

この操作により、以下が更新されます。

  1. 数量 の値を 400 に。
  2. 新しい埋め込みドキュメントを含む details フィールド。
  3. 新しい配列を持つ tags フィールド。

ドキュメントには次の値があります。

{
  _id: 100,
  quantity: 400,
  instock: true,
  reorder: false,
  details: { model: '2600', make: 'Fashionables' },
  tags: [ 'coats', 'outerwear', 'clothing' ],
  ratings: [ { by: 'Customer127', rating: 5 } ]
}

埋め込みドキュメントにフィールドを設定する

ドット表記を使用して、埋め込みテキストまたは配列内の <field> を示します。 次のアクションは、100 に等しい基準 _id を満たすドキュメントの details ドキュメントの make フィールドを変更します。

db.clothes.updateOne(
   { _id: 100 },
   { $set: { "details.make": "Kidz" } }
)

更新後、ドキュメントには次の値が含まれるようになりました。

埋め込みドキュメントにフィールドを設定 - 出力

配列内の要素を設定する

ドット表記を使用して、埋め込みテキストまたは配列内の <field> を示します。

次のアクションは、tags フィールドの 2 番目の要素の値と、100 に等しい基準 _id を満たすドキュメントの ratings 配列の最初の要素の ratings フィールドを変更します。

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        "tags.1": "rain wear",
        "ratings.0.rating": 3
      }
   }
)

更新後、ドキュメントには次の値が含まれるようになりました。

配列に要素を設定 - 出力

MongoDB の $setOnInsert 演算子

upsert: true を使用した更新操作によってドキュメントが挿入された場合、$setOnInsert は指定された値をドキュメントのフィールドに適用します。 $setOnInsert は、更新アクションの結果が挿入されない場合は何もしません。

upsert オプションを指定できます。

$setOnInsert 演算子の動作

更新演算子は、MongoDB 5.0 以降、文字列ベースの名前を持つドキュメント フィールドを辞書順に処理します。 数値名のフィールドは、番号順に処理されます。

MongoDB 5.0 で、空のオペランド式 ({}) で $setOnInsert のような更新演算子を使用すると、mongod はエラーをスローしなくなりました。 空の更新による変更はなく、oplog レコードは生成されません (操作がノーオペレーションであることを意味します)。

たとえば、clothes コレクションにはドキュメントが含まれていません。 upsert: true パラメータを指定した db.collection.updateOne() を使用して、新しいドキュメントを挿入します。

db.clothes.updateOne(
  { _id: 1 },
  {
     $set: { item: "banana" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

<query> は、_id: 1 識別子を持つ新しいドキュメントを作成するために MongoDB によって使用されます。 $setOnInsert は要求された変更をドキュメントに加えます。

新しく挿入されたドキュメントは clothes コレクションにあります。

{ "_id" : 1, "item" : "banana", "defaultQty" : 100 }

upsert パラメータが true の場合、db.collection.updateOne() メソッドは:

  1. 新しいドキュメントを作成します。
  2. $set 操作を適用します。
  3. $setOnInsert 操作を適用します。

db.collection.updateOne() が既存のドキュメントと一致する場合、MongoDB は $set 操作のみを適用します。

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

次のメソッドを使用して、MongoDB のコレクション内のすべてのドキュメントに新しいフィールドを追加できます。

次のドキュメントを使用して、コレクション チームで各メソッドを使用する例も示されています。

db.teams.insertOne({team: "United", position: "Defence", points: 31})
db.teams.insertOne({team: "Spurs", position: "Defence", points: 22})
db.teams.insertOne({team: "Palace", position: "Center", points: 19})
db.teams.insertOne({team: "Eagles", position: "Forward", points: 26})
db.teams.insertOne({team: "Lions", position: "Defence", points: 33})

値のない新しいフィールドを追加

構文:

db.collection.updateMany({}, {$set:{"new_field": null}})

次のコードを使用して、コレクション内のすべての既存のドキュメントに rebounds という新しいフィールドを null 値で追加できます。

db.teams.updateMany({}, {$set:{"rebounds": null}})

次のクエリを記述して、最初のいくつかの更新されたドキュメントを表示できます。

db.teams.find().limit(3)

このクエリは、次のドキュメントを返します。

値のない新しいフィールドの追加 - 出力

特定の値を持つ新しいフィールドを追加

構文:

db.collection.updateMany({}, {$set:{"new_field": 10}})

次のコードを使用して、値が 10rebounds という名前の新しいフィールドを、コレクション内のすべての既存のドキュメントに追加できます。

db.teams.updateMany({}, {$set:{"rebounds": 10}})

次のクエリを記述して、最初のいくつかの更新されたドキュメントを表示できます。

db.teams.find().limit(3)

このクエリは、次のドキュメントを返します。

特定の値を持つ新しいフィールドを追加 - 出力

既存のフィールドの値を使用して新しいフィールドを追加する

構文:

db.collection.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
    ]
)

次のコードを使用して、既存のフィールド teamposition を連結した値である name というフィールドを追加できます。

db.teams.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
    ]
)

次のクエリを記述して、最初のいくつかの更新されたドキュメントを表示できます。

db.teams.find().limit(3)

このクエリは、次のドキュメントを返します。

既存のフィールドの値を使用して新しいフィールドを追加 - 出力

関連記事 - MongoDB Collection