Подтвердить что ты не робот

Какая разница между replaceOne() и updateOne() в MongoDB?

Массовые операции MongoDB имеют две опции:

  1. Bulk.find.updateOne()

    Добавляет одну операцию обновления документа в список массовых операций. Операция может заменить существующий документ или обновить определенные поля в существующем документе.

  2. Bulk.find.replaceOne()

    Добавляет одну операцию замены документа в список массовых операций. Используйте метод Bulk.find(), чтобы указать условие, определяющее, какой документ заменить. Метод Bulk.find.replaceOne() ограничивает замену одним документом.

Согласно документации, оба эти двух метода могут заменить соответствующий документ. Правильно ли я понимаю, что updateOne() является более универсальным методом, который может либо заменить документ точно так же, как replaceOne(), либо просто обновить его конкретные поля?

4b9b3361

Ответ 1

С помощью 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() вы можете использовать операторы обновления в документах.

Ответ 2

replaceOne() заменяет весь документ, тогда как updateOne() позволяет обновлять или добавлять поля. При использовании 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
}

Ответ 3

db.collection.replaceOne() делает то же самое, что и db.collection.updateOne().

Основное отличие состоит в том, что редактируемые данные db.collection.replaceOne() должны будут возвращаться на сервер туда и обратно, тогда как db.collection.UpdateOne() будет запрашивать только отфильтрованные, а не весь документ!