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)
このクエリは、次のドキュメントを返します。