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

MongoDB $ setOnInsert

    MongoDB $setOnInsert フィールド更新演算子を使用して、アップサート中に特定の値を挿入できます。

    更新操作の結果、新しいドキュメントが挿入される場合(つまり、アップサート)、$setOnInsert 演算子が有効になります。それ以外の場合は効果がありません。

    dogsというコレクションがあるとします。 次のドキュメントで:

    { "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }

    そして、次のupdate()を実行します コレクションに存在しないドキュメントを更新するコマンド:

    db.dogs.update(
      { _id: 2 },
      {
         $set: { weight: 50, height: 40 },
         $setOnInsert: { name: "Bark" }
      },
      { upsert: true }
    )

    これにより、次の出力が生成されます。

    WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })

    これは、1つのドキュメントがアップサートされたことを示しています。

    コレクションを確認しましょう:

    db.dogs.find()

    結果:

    { "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
    { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }

    ドキュメント2が挿入されており、$setOnInsertに指定したフィールド/値が含まれていることがわかります。 演算子(例:name: "Bark"

    ドキュメントが存在する場合(つまり、アップサートなし)

    次に、アップサートしたばかりのドキュメントを更新してみましょう。前の例と同じステートメントを使用しますが、値は異なります。

    db.dogs.update(
      { _id: 2 },
      {
         $set: { weight: 55, height: 45 },
         $setOnInsert: { name: "Fluffy" }
      },
      { upsert: true }
    )

    出力:

    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    今回は、1つのドキュメントが一致して更新されました。何も支持されませんでした。

    コレクションをもう一度確認しましょう。

    db.dogs.find()

    結果:

    { "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
    { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }

    したがって、この場合、weight およびheight フィールドは更新されましたが、name フィールドはそうではありませんでした。

    名前フィールドが更新されなかった理由は、アップサートが実行されていなかったためです。 $setOnInsert 演算子は、更新操作によって新しいドキュメントが挿入された場合(つまり、アップサート)に設定されるフィールド/値のみを指定します。


    1. $ project:1つのステージで式の結果のプロパティにアクセスすることは可能ですか?

    2. redisが実行されているかどうかを確認します->ノードjs

    3. 100%の稼働時間のための地理的に分散されたMongoDBレプリカセット

    4. Spring Data Redis:Redisパイプラインが常にnullを返す