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 を満たすドキュメントの quantity、details、および tags フィールドの値を変更します。
db.clothes.updateOne(
{ _id: 100 },
{ $set:
{
quantity: 400,
details: { model: "2600", make: "Fashionables" },
tags: [ "coats", "outerwear", "clothing" ]
}
}
)
この操作により、以下が更新されます。
数量の値を400に。- 新しい埋め込みドキュメントを含む
detailsフィールド。 - 新しい配列を持つ
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() メソッドは:
- 新しいドキュメントを作成します。
$set操作を適用します。$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}})
次のコードを使用して、値が 10 の rebounds という名前の新しいフィールドを、コレクション内のすべての既存のドキュメントに追加できます。
db.teams.updateMany({}, {$set:{"rebounds": 10}})
次のクエリを記述して、最初のいくつかの更新されたドキュメントを表示できます。
db.teams.find().limit(3)
このクエリは、次のドキュメントを返します。

既存のフィールドの値を使用して新しいフィールドを追加する
構文:
db.collection.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
]
)
次のコードを使用して、既存のフィールド team と position を連結した値である name というフィールドを追加できます。
db.teams.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
]
)
次のクエリを記述して、最初のいくつかの更新されたドキュメントを表示できます。
db.teams.find().limit(3)
このクエリは、次のドキュメントを返します。
