MongoDB: обновление документов

В MongoDB операцию обновления документов можно реализовать несколькими методами. Обычно используемые методы включают:updateOne(), updateMany(), replaceOne() и findOneAndUpdate()。

1、updateOne()

Метод updateOne() используется для обновления одного документа, соответствующего фильтру.

Синтаксис:

db.collection.updateOne(filter, update, options)
  • filter: Условие запроса, используемое для поиска документов.
  • update: Указывает документ или оператор обновления для операции обновления.
  • options: Необязательный объект параметров, напримерupsert、arrayFiltersи т. д.

Пример

db.myCollection.updateOne(
    { name: "Alice" },                // Условие фильтра
    { $set: { age: 26 } },            // Операция обновления
    { upsert: false }                 // Необязательные параметры
);

2、updateMany()

Метод updateMany() используется для обновления всех документов, соответствующих фильтру.

Синтаксис:

db.collection.updateMany(filter, update, options)
  • filter: Условие запроса, используемое для поиска документов.
  • update: Указывает документ или оператор обновления для операции обновления.
  • options: Необязательный объект параметров, напримерupsert、arrayFiltersи т. д.

Пример

db.myCollection.updateMany(
    { age: { $lt: 30 } },             // Условие фильтра
    { $set: { status: "active" } },   // Операция обновления
    { upsert: false }                  // Необязательные параметры
);

3、replaceOne()

Метод replaceOne() используется для замены одного документа, соответствующего фильтру. Новый документ полностью заменит старый документ.

Синтаксис:

db.collection.replaceOne(filter, replacement, options)
  • filter: Условие запроса, используемое для поиска документов.
  • replacement: Новый документ, который заменит старый документ.
  • options: Необязательный объект параметров, напримерupsertи т. д.

Пример

db.myCollection.replaceOne(
{ name: "Bob" }, // Условие фильтра
{ name: "Bob", age: 31 } // Новый документ
);

4、findOneAndUpdate()

Метод findOneAndUpdate() используется для поиска и обновления одного документа и может опционально возвращать документ до или после обновления.

Синтаксис:

db.collection.findOneAndUpdate(filter, update, options)
  • filter: Условие запроса, используемое для поиска документов.
  • update: Указывает документ или оператор обновления для операции обновления.
  • options: Необязательный объект параметров, напримерprojection、sort、upsert、returnDocumentи т. д.

Пример

db.myCollection.findOneAndUpdate(
    { 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 );
Другие расширения