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 のオブジェクトを部分的に更新し、新しいオブジェクトが既存のオブジェクトとオーバーレイ/マージされるようにする方法を学びました。