MongoDBでは、 db.collection.findOneAndReplace()
メソッドは、指定されたフィルターに基づいて単一のドキュメントを置き換えます。
コレクション
partは、操作を実行するコレクションの名前です。
例
pets
というコレクションがあるとします。 次のドキュメントが含まれています:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
db.collection.findOneAndReplace()
を使用できます それらのドキュメントの1つを置き換える方法。
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
デフォルトでは、元のドキュメント(変更されたバージョンではありません)が返されます。
コレクションには2匹の犬がいますが、更新されたのは1匹だけであることに注意してください。
コレクションを確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
最初のドキュメントが新しいドキュメントに置き換えられたことがわかります。
置換ドキュメントでは_id
を指定できないことに注意してください _id
とは異なる値 置き換えられたドキュメントの値。
変更されたドキュメントを返す
デフォルトでは、 db.collection.findOneAndReplace()
を使用すると元のドキュメントが返されます 。
代わりに変更されたドキュメントを返す場合は、 returnNewDocument
を使用してください パラメータ。
別の変更を加えましょうが、今回は returnNewDocument:true
を使用します 。
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
{ returnNewDocument: true }
)
結果:
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
今回はもう一人の犬が更新されました。この場合、より重要な変更を加えました。返品ドキュメントにはこれが反映されていることがわかります。
コレクションをもう一度チェックして、置き換えられたドキュメントを確認できます。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
アップサート
アップサートは、更新操作で使用できるオプションです。指定したドキュメントが存在しない場合は、新しいドキュメントが挿入されます。 する 存在する場合、元のドキュメントが更新されます(ドキュメントは挿入されません)。
upsert:true
を指定すると、アップサートを実行できます 。
upsert:false
を使用した例
まず、 upload:false
のときに存在しないドキュメントを更新しようとする例を次に示します。 。
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
returnNewDocument: true
}
)
結果:
null
ドキュメントがコレクションに存在しなかったため、 findOneAndReplace()
返されたnull
。 upsert:false
を明示的に指定しなかった場合でも 、これがデフォルト値であるため、falseであることがわかります(つまり、アップサートオプションを指定しない場合に使用される値です)。
コレクションをもう一度見ると、ドキュメントがアップサートされていないことがわかります。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
upsert:true
を使用した例
ここでもここにありますが、今回は upload:true
を指定します 。
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
upsert: true,
returnNewDocument: true
}
)
結果:
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
今回は新しいドキュメントがアップサートされ、アップサートされたドキュメントが出力として表示されます( returnNewDocument:true
を指定したため) 。
コレクションをもう一度確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
したがって、新しいドキュメントが実際にアップサートされたことがわかります。
並べ替えコード> パラメータ
sort
を使用できます filter
によって一致するドキュメントの並べ替え順序を指定するパラメータ 。
sort
を使用する場合 パラメータ、 1
の値 ドキュメントを昇順で並べ替え、値は -1
それらを降順で並べ替えます。
引数はドキュメントとして提供する必要があります。たとえば、 {sort:{"salary":1}}
給与
で並べ替えます 昇順のフィールド。
たとえば、 employees
というコレクションを作成するとします。 次のドキュメントを使用:
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
次のコードを実行して、給与が60000未満のドキュメントを検索し、それらのドキュメントの中で最も低いドキュメントを置き換えることができます。
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
結果:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
これは、更新される前のドキュメントを示しています。予想どおり、給与が最も低い従業員が新しい給与(および新しい名前)に置き換えられました。
現在のドキュメントは次のようになっています。
db.employees.find()
結果:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fluffy", "salary" : 250000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
したがって、フリッツがはるかに高い給料のふわふわに取って代わられていることがわかります。
元のドキュメントに戻しましょう。
db.employees.remove({})
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
次に、同じ findOneAndReplace()
を実行してみましょう。 もう一度コードを記述しますが、今回は降順で並べ替えます。
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
結果:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
今回はサンディが交換されました。
コレクションをもう一度確認しましょう。
db.employees.find()
結果:
{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
予想通り。
詳細情報
db.collection.findOneAndReplace()
メソッドは、 Projection
などの他のパラメータも受け入れます (返すフィールドのサブセットを指定するため)、 maxTimeMS
、および collation
。
db.collections.findOneAndReplace()
についてはMongoDBのドキュメントを参照してください 詳細については。