sql >> データベース >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

    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 、および collat​​ion

    詳細については、MongoDBのドキュメントを参照してください。


    1. PHPとMongoDBの使用開始

    2. nginx/uwsgiサーバー用の永続的なメモリ内Pythonオブジェクト

    3. マングースを使用してインデックスを削除する方法

    4. 'または'条件のMongoDBクエリ