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

MongoDB findOneAndReplace()

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

    db.collections.findOneAndReplace()についてはMongoDBのドキュメントを参照してください 詳細については。


    1. MongoDBの'count()'は非常に遅いです。どのようにそれを改良/回避しますか?

    2. PHPでRedisToGoに接続する

    3. MongoDBでインデックスを削除する3つの方法

    4. マングースを使用したMongoDBでの一括アップサート