MongoDB $Set 演算子

Tahseen Tauseef 2024年2月15日
  1. MongoDB $set 演算子
  2. 最上位フィールドの設定
  3. 埋め込みドキュメントにフィールドを設定する
  4. 配列内の要素を設定する
  5. $set (集計)
  6. 2つの $set ステージを使用する
  7. 埋め込みドキュメントにフィールドを追加する
  8. 既存のフィールドを上書きする
  9. 要素を配列に追加する
MongoDB $Set 演算子

この記事の助けを借りて、$set 演算子を使用して MongoDB のオブジェクトを部分的に更新し、新しいオブジェクトが既存のオブジェクトにオーバーレイ/マージされるようにする方法を学びます。

$set 演算子は、フィールドの値を指定された値に置き換えます。 $set 演算子式は、次の構文を使用します。

{ $set: { <field1>: <value1>, ... } }

ドット表記を使用して、埋め込まれたドキュメントまたは配列で <field> を指定します。

MongoDB $set 演算子

フィールドが存在しない場合、新しいフィールドが制約に違反しない限り、$set 演算子は指定された値でフィールドを作成します。

たとえば、存在しないフィールドにドット パスを指定すると、$set 演算子は必要に応じて埋め込みドキュメントを生成し、ドット パスを完成させます。

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

次の products コレクションを作成できます。

db={
  "products": [
    {
      _id: 100,
      quantity: 250,
      instock: true,
      reorder: false,
      details: {
        model: "PTI",
        make: "Breakout"
      },
      tags: [
        "jeans",
        "clothing"
      ],
      ratings: [
        {
          by: "CustomerIK",
          rating: 3
        }
      ]
    }
  ]
}

最上位フィールドの設定

_id100 に等しいという条件に一致するドキュメントの場合、以下の操作は $set 演算子を使用して details フィールド、quantity フィールド、および tags フィールドの値を更新します。 これに対するクエリを以下に示します。

db.products.update(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        details: { model: "2600", make: "Outfitters" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

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

  1. 数量 の値を 500 に。
  2. 新しいドキュメントが埋め込まれた details フィールド
  3. 新しい配列を持つ tags フィールド

上記のクエリの結果は、次のスクリーンショットに示されています。

最上位フィールドの設定

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

埋め込まれたドキュメントまたは配列で <field> を指定するには、ドット表記を使用します。 100 に等しい基準 _id に一致するドキュメントの場合、次の操作は details ドキュメントの make フィールドを更新します。

これに対するクエリを以下に示します。

db.products.update(
   { _id: 100 },
   { $set: { "details.make": "Breakout Kids" } }
)

上記のクエリの結果は、次のスクリーンショットに示されています。

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

配列内の要素を設定する

次のアクションは、tags フィールドの 2 番目の要素 (配列インデックス 1) の値と ratings 配列の最初の要素 (配列インデックス 0) の rating フィールドの値を変更します。 _id100 に等しいドキュメント。

これに対するクエリを以下に示します。

db.products.update(
   { _id: 100 },
   { $set:
      {
        "tags.1": "wind breaker",
        "ratings.0.rating": 2
      }
   }
)

上記のクエリの結果は、次のスクリーンショットに示されています。

要素を配列に設定

$set (集計)

$set (集約) はドキュメントに新しいフィールドを追加します。 $set は、入力ドキュメントからのすべての既存のフィールドと新しく追加されたフィールドを含むドキュメントを出力します。

$set (集計) の構文は次のとおりです。

{ $set: { <newField>: <expression>, ... } }

$set は、既存のドキュメントに新しいフィールドを追加するコマンドです。 ユーザーは、集計操作に 1つ以上の $set ステージを含めることができます。

ドット表記を使用して、フィールドまたはフィールドを埋め込みドキュメント (配列内のドキュメントを含む) に追加します。 $concatArrays を使用して、$set を使用して既存の配列フィールドに要素を追加します。

2つの $set ステージを使用する

以下を使用してサンプル grades コレクションを作成します。

db={
  "grades": [
    {
      _id: 1,
      student: "Ali",
      homework: [10, 8, 9],
      quiz: [9, 8],
      extraCredit: 3
    },
    {
      _id: 2,
      student: "Manahil",
      homework: [3, 8, 5],
      quiz: [7, 9],
      extraCredit: 6
    }
  ]
}

次のプロセスでは、2つの $set ステージを使用して、3つの新しいフィールドを出力ドキュメントに追加します。 これに対するクエリを以下に示します。

db.grades.aggregate( [
   {
     $set: {
        totalHomework: { $sum: "$homework" },
        totalQuiz: { $sum: "$quiz" }
     }
   },
   {
     $set: {
        totalScore: { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
   }
] )

以下のスクリーンショットに示すように、操作は次のドキュメントを返します。

2つのセット ステージを使用

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

次のサンプル コレクション transport を作成します。

db={
  "transport": [
    {
      _id: 1,
      type: "sedan",
      specs: { doors: 4, wheels: 4}
    },
    {
      _id: 2,
      type: "motorbike",
      specs: {doors: 0, wheels: 2}
    },
    {
      _id: 3,
      type: "jet ski"
    }
  ]
}

次の集計操作は、埋め込みドキュメント specs に新しいフィールド fuel_type を作成します。 これに対するクエリを以下に示します。

db.transport.aggregate( [
   { $set: { "specs.fuel_type": "super" } }
] )

以下のスクリーンショットに示すように、操作は次の結果を返します。

埋め込みドキュメントにフィールドを追加

既存のフィールドを上書きする

$set 操作で既存のフィールド名を指定すると、元のフィールドが置き換えられます。 次のアイテムで pets サンプル コレクションを作成します。

db={
  "pets": [
    {
      _id: 1,
      dogs: 10,
      cats: 5
    }
  ]
}

次の $set 操作は cats フィールドをオーバーライドします。 これに対するクエリを以下に示します。

db.pets.aggregate( [
  { $set: { "cats": 20 } }
] )

以下のスクリーンショットに示すように、操作は次のドキュメントを返します。

既存のフィールドを上書き

要素を配列に追加する

次のレコードを使用してサンプル grades コレクションを作成します。

db={
  "grades": [
    {
      _id: 1,
      student: "Ali",
      homework: [10, 8, 9],
      quiz: [9, 8],
      extraCredit: 3
    },
    {
      _id: 2,
      student: "Manahil",
      homework: [3, 8, 5],
      quiz: [7, 9],
      extraCredit: 6
    }
  ]
}

ユーザーは、$concatArrays 式で $set 演算子を使用できます。 これにより、既存の配列フィールドに要素が追加されます。

次の操作では、$set を使用して homework フィールドを、新しいスコア [ 7 ] を含む別の配列と連結された現在の homework 配列を要素とする新しい配列に置き換えます。 これに対するクエリを以下に示します。

db.grades.aggregate([
   { $match: { _id: 2 } },
   { $set: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
])

以下のスクリーンショットに示すように、操作は次のドキュメントを返します。

要素を配列に追加

この記事では、$set 演算子を使用して MongoDB のオブジェクトを部分的に更新し、新しいオブジェクトが既存のオブジェクトとオーバーレイ/マージされるようにする方法を学びました。

関連記事 - MongoDB Operator