MongoDBでは、db.collection.updateOne()
メソッドは、フィルターに基づいてコレクション内の単一のドキュメントを更新します。
例
pets
というコレクションがあるとします。 次のドキュメントが含まれています:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
次のように1つのドキュメントを更新できます:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
結果:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
2つのドキュメントがフィルター基準(type: "Dog"
である基準)に一致する場合でも、1つのドキュメントのみが更新されました。 。
次のように結果を確認できます:
db.pets.find()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
これで、最初のドキュメントにtype
が追加されました Cow
の Dog
の代わりに 、ただし、2番目のドキュメントは、フィルタリング基準にも一致していても、影響を受けませんでした。
アップサート
db.collection.updateOne()
メソッドはupsert
を受け入れます アップサート操作を実行できるようにする引数。
upsert: true
の場合 、フィルタ条件に一致する場合はドキュメントが更新されますが、一致しない場合は新しいドキュメントが挿入されます。
元のドキュメントからもう一度始めましょう:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
例:
db.pets.updateOne(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
結果:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1e94dd991410169410199") }
この場合、一致するものがなかったため、ドキュメントがアップサートされました。
コレクションを確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1e94dd991410169410199"), "name" : "Bubbles", "type" : "Fish" }
埋め込みドキュメント
db.collection.updateOne()
を使用することもできます 埋め込まれたドキュメントを更新します。
次のドキュメントがあるとします。
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
次のコードを使用して、埋め込まれたドキュメントを更新できます。
db.pets.updateOne({
_id: 1
}, {
$set: {
"specs.weight": 20,
"specs.color": "blue"
}
})
結果:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
したがって、1つのドキュメントが更新されたことがわかります。
ドキュメントを確認しましょう。
db.pets.find({
_id: 1
}).pretty()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 20, "color" : "blue" } }
埋め込まれたドキュメントが指定どおりに更新されたことがわかります。
配列
db.collection.updateOne()
を使用しましょう アレイを更新します。
次のドキュメントがあるとします。
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }>
2つの配列要素と犬の名前を更新しましょう。
db.pets.updateOne({
_id: 1
}, {
$set: {
"name": "Bark",
"awards.0": "Bottom Dog",
"awards.1": "Worst Dog"
}
})
結果:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
1つのドキュメントが更新されたことがわかります。
そして、ドキュメントを見てみましょう。
db.pets.find().pretty()
結果:
{ "_id" : 1, "name" : "Bark", "type" : "Dog", "awards" : [ "Bottom Dog", "Worst Dog", "Biggest Dog" ] }>
arrayFilters
パラメータ
arrayFilters
を使用することもできます パラメータと位置の$
更新する配列要素を決定する演算子。
たとえば、players
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
次のクエリを実行して、特定の量(この場合は10)よりも高い値を持つ配列要素のみを更新できます。
db.players.updateOne(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
結果:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
予想どおり、2つのドキュメントが基準に一致していても、これは1つのドキュメントのみを更新します。
現在のドキュメントは次のようになっています。
db.players.find()
結果:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
ドキュメント2では、2つの配列要素が基準に一致したため、これらの要素が更新されました。
詳細情報
db.collection.updateOne()
メソッドは、writeConcern
などの他のパラメータも受け入れます 、collation
、およびhint
。
db.collections.updateOne()
については、MongoDBのドキュメントを参照してください。 詳細については。