MongoDB: обновление документов
В MongoDB операцию обновления документов можно реализовать несколькими методами. Обычно используемые методы включают:updateOne(), updateMany(), replaceOne() и findOneAndUpdate()。
1、updateOne()
Метод updateOne() используется для обновления одного документа, соответствующего фильтру.
Синтаксис:
db.collection.updateOne(filter, update, options)
- filter: Условие запроса, используемое для поиска документов.
- update: Указывает документ или оператор обновления для операции обновления.
- options: Необязательный объект параметров, например
upsert、arrayFiltersи т. д.
Пример
{ name: "Alice" }, // Условие фильтра
{ $set: { age: 26 } }, // Операция обновления
{ upsert: false } // Необязательные параметры
);
2、updateMany()
Метод updateMany() используется для обновления всех документов, соответствующих фильтру.
Синтаксис:
db.collection.updateMany(filter, update, options)
- filter: Условие запроса, используемое для поиска документов.
- update: Указывает документ или оператор обновления для операции обновления.
- options: Необязательный объект параметров, например
upsert、arrayFiltersи т. д.
Пример
{ age: { $lt: 30 } }, // Условие фильтра
{ $set: { status: "active" } }, // Операция обновления
{ upsert: false } // Необязательные параметры
);
3、replaceOne()
Метод replaceOne() используется для замены одного документа, соответствующего фильтру. Новый документ полностью заменит старый документ.
Синтаксис:
db.collection.replaceOne(filter, replacement, options)
- filter: Условие запроса, используемое для поиска документов.
- replacement: Новый документ, который заменит старый документ.
- options: Необязательный объект параметров, например
upsertи т. д.
Пример
{ name: "Bob" }, // Условие фильтра
{ name: "Bob", age: 31 } // Новый документ
);
4、findOneAndUpdate()
Метод findOneAndUpdate() используется для поиска и обновления одного документа и может опционально возвращать документ до или после обновления.
Синтаксис:
db.collection.findOneAndUpdate(filter, update, options)
- filter: Условие запроса, используемое для поиска документов.
- update: Указывает документ или оператор обновления для операции обновления.
- options: Необязательный объект параметров, например
projection、sort、upsert、returnDocumentи т. д.
Пример
{ name: "Charlie" }, // Условие фильтра
{ $set: { age: 36 } }, // Операция обновления
{ returnDocument: "after" } // Необязательные параметры, вернуть обновлённый документ
);
Параметры опций
Параметр options этих методов обновления обычно может включать следующие параметры:
- upsert: Вставлять ли новый документ, если не найден соответствующий документ.
- arrayFilters: При обновлении вложенных массивов задаёт условие для элементов массива, которые должны быть обновлены.
- collation: Задает правила сопоставления, используемые при сравнении строк.
- returnDocument: Используется в findOneAndUpdate, указывает, возвращать документ до обновления ("before") или после обновления ("after").
Простой пример
Обновить один документ:
db.myCollection.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } }
);Обновить несколько документов:
db.myCollection.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "active" } }
);Заменить один документ:
db.myCollection.replaceOne(
{ name: "Bob" },
{ name: "Bob", age: 31 }
);
Найти и обновить один документ:
db.myCollection.findOneAndUpdate(
{ name: "Charlie" },
{ $set: { age: 36 } },
{ returnDocument: "after" }
);
В следующем примере мы заменили данные документа с _id 56064f89ade2f21f36b03136:
>db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Example",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
После успешной замены мы можем использовать команду find() для просмотра заменённых данных.
>db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Example",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
>
Другие примеры
Обновить только первую запись:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
Обновить все:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
Вставить только первую запись:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
Вставить все:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
Обновить все:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
Обновить только первую запись:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false ); Другие расширения