MongoDBでは、db.collection.findOneAndUpdate()
メソッドは、filter
に基づいて単一のドキュメントを更新します およびsort
基準。
collection
partは、操作を実行するコレクションの名前です。
例
pets
というコレクションがあるとします。 次のドキュメントが含まれています:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
db.collection.findOneAndUpdate()
を使用できます それらのドキュメントの1つを更新する方法。
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Cow" } }
)
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
デフォルトでは、元のドキュメント(変更されたバージョンではありません)が返されます。
コレクションには2匹の犬がいますが、更新されたのは1匹だけであることに注意してください。
コレクションを確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
最初のドキュメントに犬ではなく牛が含まれていることがわかります。
変更されたドキュメントを返す
デフォルトでは、db.collection.findOneAndUpdate()
を使用すると、元のドキュメントが返されます。 。
代わりに変更されたドキュメントを返す場合は、returnNewDocument
を使用してください パラメータ。
別の変更を加えましょうが、今回はreturnNewDocument: true
を使用します 。
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Horse" } },
{ returnNewDocument: true }
)
結果:
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
今回はもう一人の犬が更新されました。この場合、馬に変更しましたが、返品ドキュメントにこれが反映されていることがわかります。
アップサート
アップサートは、更新操作で使用できるオプションです。指定したドキュメントが存在しない場合は、新しいドキュメントが挿入されます。 する 存在する場合、元のドキュメントが更新されます(ドキュメントは挿入されません)。
upsert: true
を指定すると、アップサートを実行できます 。
upsert: false
を使用した例
まず、upsert: false
のときに存在しないドキュメントを更新しようとする例を次に示します。 。
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
returnNewDocument: true
}
)
結果:
null
ドキュメントがコレクションに存在しなかったため、findOneAndUpdate()
返されたnull
。 upsert: false
を指定しなかった場合でも 、これがデフォルト値であるため、falseであることがわかります(つまり、アップサートオプションを指定しない場合に使用される値です)。
コレクションをもう一度見ると、ドキュメントがアップサートされていないことがわかります。
db.pets.find()
結果:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Scratch", "type" : "Cat" }
upsert: true
を使用した例
ここでもここにありますが、今回はupsert: true
を指定します 。
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
upsert: true,
returnNewDocument: true
}
)
結果:
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }
今回は新しいドキュメントがアップサートされ、アップサートされたドキュメントが出力として表示されます(returnNewDocument: true
を指定したため) 。
コレクションをもう一度確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Barry", "type" : "Badger" }
したがって、新しいドキュメントが実際にアップサートされたことがわかります。
arrayFilters
パラメータ
配列を操作するときは、arrayFilters
を使用できます 位置$
とともにパラメータ 更新する配列要素を決定する演算子。これにより、位置がわからなくても、値に基づいて配列要素を更新できます。
たとえば、players
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
次のクエリを実行して、特定の量(この場合は10)よりも高い値を持つ配列要素のみを更新できます。
db.players.findOneAndUpdate(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{
arrayFilters: [ { "e": { $gte: 10 } } ]
}
)
結果:
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
これは、更新される前のドキュメントを示しています。予想どおり、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.findOneAndUpdate()
メソッドは、projection
などの他のパラメータも受け入れます (返すフィールドのサブセットを指定するため)、sort
、maxTimeMS
、およびcollation
。
db.collections.findOneAndUpdate()
についてはMongoDBのドキュメントを参照してください 詳細については。