Question: MongoDB bulk operations have two options:

1. [**`Bulk.find.updateOne()`**](https://docs.mongodb.org/manual/reference/method/Bulk.find.updateOne/)

> 
> Adds a single document update operation to a bulk operations list. The operation can either replace an existing document or update specific fields in an existing document.
> 
> 
>
2. [**`Bulk.find.replaceOne()`**](https://docs.mongodb.org/manual/reference/method/Bulk.find.replaceOne/)

> 
> Adds a single document replacement operation to a bulk operations list. Use the `Bulk.find()` method to specify the condition that determines which document to replace. The `Bulk.find.replaceOne()` method limits the replacement to a single document.
> 
> 
>

According to the documentation, both of these two methods can replace a matching document. Do I understand correctly, that `updateOne()` is more general purpose method, which can either replace the document exactly like `replaceOne()` does, or just update its specific fields?

Answer: 
With `replaceOne()` you can only replace the entire document, while `updateOne()` allows for updating fields.

Since `replaceOne()` replaces the entire document - fields in the old document not contained in the new will be lost. With `updateOne()` new fields can be added without losing the fields in the old document.

For example if you have the following document:

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

```

Using:

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

```

results in:

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

```

Using:

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

```

results in:

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

```

Note that with `updateOne()` you can use the [update operators](https://docs.mongodb.org/manual/reference/operator/update/) on documents.
`replaceOne()` replaces the entire document, while `updateOne()` allows for updating or adding fields. When using `updateOne()` you also have access to the [update operators](https://docs.mongodb.org/manual/reference/operator/update/) which can reliably perform updates on documents. For example two clients can "simultaneously" increment a value on the same field in the same document and both increments will be captured, while with a replace the one may overwrite the other potentially losing one of the increments.

Since `replaceOne()` replaces the entire document - fields in the old document not contained in the new will be lost. With `updateOne()` new fields can be added without losing the fields in the old document.

For example if you have the following document:

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

   "my_test_key3" : 3333
}

```

Using:

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

```

results in:

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

```

Using:

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

```

results in:

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

```