MongoDB $Set 演算子
- 
          
            MongoDB $set演算子
- 最上位フィールドの設定
- 埋め込みドキュメントにフィールドを設定する
- 配列内の要素を設定する
- 
          
            $set(集計)
- 
          
            2つの $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
        }
      ]
    }
  ]
}
最上位フィールドの設定
_id が 100 に等しいという条件に一致するドキュメントの場合、以下の操作は $set 演算子を使用して details フィールド、quantity フィールド、および tags フィールドの値を更新します。 これに対するクエリを以下に示します。
db.products.update(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        details: { model: "2600", make: "Outfitters" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)
上記の操作により、以下が更新されます。
- 数量の値を- 500に。
- 新しいドキュメントが埋め込まれた detailsフィールド
- 新しい配列を持つ tagsフィールド
上記のクエリの結果は、次のスクリーンショットに示されています。

埋め込みドキュメントにフィールドを設定する
埋め込まれたドキュメントまたは配列で <field> を指定するには、ドット表記を使用します。 100 に等しい基準 _id に一致するドキュメントの場合、次の操作は details ドキュメントの make フィールドを更新します。
これに対するクエリを以下に示します。
db.products.update(
   { _id: 100 },
   { $set: { "details.make": "Breakout Kids" } }
)
上記のクエリの結果は、次のスクリーンショットに示されています。

配列内の要素を設定する
次のアクションは、tags フィールドの 2 番目の要素 (配列インデックス 1) の値と ratings 配列の最初の要素 (配列インデックス 0) の rating フィールドの値を変更します。 _id が 100 に等しいドキュメント。
これに対するクエリを以下に示します。
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" ] } }
   }
] )
以下のスクリーンショットに示すように、操作は次のドキュメントを返します。

埋め込みドキュメントにフィールドを追加する
次のサンプル コレクション 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 のオブジェクトを部分的に更新し、新しいオブジェクトが既存のオブジェクトとオーバーレイ/マージされるようにする方法を学びました。