Какая разница между replaceOne() и updateOne() в MongoDB?
Массовые операции MongoDB имеют две опции:
Bulk.find.updateOne()
Добавляет одну операцию обновления документа в список массовых операций. Операция может заменить существующий документ или обновить определенные поля в существующем документе.
Bulk.find.replaceOne()
Добавляет одну операцию замены документа в список массовых операций. Используйте метод Bulk.find()
, чтобы указать условие, определяющее, какой документ заменить. Метод Bulk.find.replaceOne()
ограничивает замену одним документом.
Согласно документации, оба эти двух метода могут заменить соответствующий документ. Правильно ли я понимаю, что updateOne()
является более универсальным методом, который может либо заменить документ точно так же, как replaceOne()
, либо просто обновить его конкретные поля?
Ответы
Ответ 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()
будет запрашивать только отфильтрованные, а не весь документ!