MongoDBでは、 db.collection.findOneAndDelete()
メソッドは1つのドキュメントを削除し、削除されたドキュメントを返します。
filter
に一致するコレクション内の最初に一致するドキュメントを削除します 。 sort
パラメータを使用して、削除するドキュメントに影響を与えることができます。
コレクション
partは、ドキュメントを削除するコレクションの名前です。
例
pets
というコレクションがあるとします。 次のドキュメントが含まれています:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } } { "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
db.collection.findOneAndDelete()
を使用できます それらのドキュメントの1つを削除する方法。
db.pets.findOneAndDelete(
{ "type": "Cat" }
)
結果:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
この場合、クエリを使用して猫だけに絞り込みました。コレクションに2匹の猫がいますが、削除された猫は1匹だけです。
コレクションを確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } } { "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
最初の猫(ドキュメント3)が削除されたことがわかります。
埋め込みドキュメント
埋め込みドキュメントを含むドキュメントがある場合は、次の方法を使用して、埋め込みドキュメントのデータをクエリできます。
- ドット表記(例:
field.nestedfield:
) - ネストされたフォーム(例:{
フィールド:{ネストされたフィールド:<値>}}
)。このオプションはMongoDB4.4からのみ利用可能であることに注意してください。
埋め込みドキュメント内でクエリを実行するためにドット表記を使用する例を次に示します。
db.pets.findOneAndDelete({ "specs.height": 400 })
結果:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
予想どおり、ドキュメント6は削除されました。
次のクエリは同じドキュメントを削除しますが、この場合、ネストされたフォームを使用して埋め込みドキュメントを参照します。
db.pets.findOneAndDelete({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
ネストされたフォームを使用する場合、クエリは埋め込みドキュメント全体と正確に一致する必要があります。たとえば、次のクエリは一致しません:
db.pets.findOneAndDelete({
"specs" : {
"height" : 400
}
})
結果:
null
配列
配列要素をそのインデックスまたは値で参照することにより、配列内のデータを参照できます。
トップドッグ賞を受賞したすべての犬を削除したい場合は、次のクエリを記述できます(上記の犬が返されます)。
db.pets.findOneAndDelete({
"awards": "Top Dog"
})
結果:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }>
次のように要素インデックスを指定することもできます:
db.pets.findOneAndDelete({
"awards.0": "Top Dog"
})
そのためには、指定された値が指定されたインデックスにある必要があります。したがって、次のクエリは同じ犬を返しません。
db.pets.findOneAndDelete({
"awards.1": "Top Dog"
})
配列はゼロベースであるため、インデックス0は最初の要素を指定し、1は2番目の要素を指定します。
並べ替えコード> パラメータ
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.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
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" : 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 }
])
同じfindOneAndDelete()
を実行してみましょう もう一度コードを記述しますが、今回は降順で並べ替えます。
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": -1 }
}
)
結果:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
今回はSandyが削除されました。
コレクションをもう一度確認しましょう。
db.employees.find()
結果:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
予想どおり、Sandyはコレクションに含まれていません。
詳細情報
db.collection.findOneAndDelete()
メソッドは、 Projection
などの他のパラメータも受け入れます (返すフィールドのサブセットを指定するため)、 maxTimeMS
、および collation
。
詳細については、MongoDBのドキュメントを参照してください。