web-dev-qa-db-ja.com

MongoDBのreplaceOne()とupdateOne()の違いは何ですか?

MongoDB一括操作には2つのオプションがあります。

  1. Bulk.find.updateOne()

    一括操作リストに単一のドキュメント更新操作を追加します。この操作では、既存のドキュメントを置き換えるか、既存のドキュメントの特定のフィールドを更新できます。

  2. Bulk.find.replaceOne()

    一括操作リストに単一のドキュメント置換操作を追加します。 Bulk.find()メソッドを使用して、置換するドキュメントを決定する条件を指定します。 Bulk.find.replaceOne()メソッドは、置換を単一のドキュメントに制限します。

ドキュメントによると、これらの2つの方法はどちらも一致するドキュメントを置き換えることができます。 updateOne()はより汎用的なメソッドであり、replaceOne()とまったく同じようにドキュメントを置き換えるか、単に特定のフィールドを更新することができるかを正しく理解していますか?

39
Mike B.

replaceOne()を使用すると、ドキュメント全体を置換できますが、updateOne()ではフィールドの更新が可能です。

replaceOne()はドキュメント全体を置き換えるため、新しいドキュメントに含まれていない古いドキュメントのフィールドは失われます。 updateOne()を使用すると、古いドキュメントのフィールドを失うことなく、新しいフィールドを追加できます。

たとえば、次のドキュメントがある場合:

_{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333
}
_

を使用して:

_replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})
_

結果:

_{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}
_

を使用して:

_updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})
_

結果:

_{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}
_

updateOne()を使用すると、ドキュメントで 更新演算子 を使用できることに注意してください。

44
Hughzi

replaceOne()はドキュメント全体を置き換えますが、updateOne()はフィールドの更新または追加を許可します。 updateOne()を使用すると、ドキュメントの更新を確実に実行できる 更新演算子 にもアクセスできます。たとえば、2つのクライアントは同じドキュメントの同じフィールドの値を「同時に」インクリメントでき、両方のインクリメントがキャプチャされますが、置換では一方がインクリメントを失う可能性のある他方を上書きできます。

replaceOne()はドキュメント全体を置き換えるため、新しいドキュメントに含まれていない古いドキュメントのフィールドは失われます。 updateOne()を使用すると、古いドキュメントのフィールドを失うことなく、新しいフィールドを追加できます。

たとえば、次のドキュメントがある場合:

{
   "_id" : ObjectId("0123456789abcdef01234567"),

   "my_test_key3" : 3333
}

を使用して:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

結果:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}

を使用して:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

結果:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}
3
Jurgen Strydom

db.collection.replaceOne()は、db.collection.updateOne()とまったく同じことを行います。

主な違いは、編集中のdb.collection.replaceOne()のデータはサーバーに行き来しなければならないのに対し、db.collection.UpdateOne()はドキュメント全体ではなくフィルターされたもののみを要求するということです。

0
Evangelos