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

MongoDB findOneAndUpdate()

    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() 返されたnullupsert: 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などの他のパラメータも受け入れます (返すフィールドのサブセットを指定するため)、sortmaxTimeMS 、およびcollation

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


    1. ApacheHBaseのMOBの新しいサポートの内部

    2. MongoDBエラー:limit=0で再試行可能な書き込みを使用できません

    3. MongoDBでデータのバージョン管理を実装する方法

    4. アプリケーションでマングースが発火するすべてのクエリをログに記録する