Пример использования findAndModify() в MongoDB

MongoDB метод findAndModify() модифицирует и возвращает один документ на основе введенных критериев выбора. Возвращаемый документ по умолчанию не отображает обновленное содержимое. Если записи, соответствующие критериям, не существует в базе данных, будет вставлена новая запись, если параметр upsert установлен в true.

MongoDB findAndModify()

Синтаксис метода findAndModify в MongoDB выглядит следующим образом.

db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>
})

Описание параметров следующее. query: Определяет критерии выбора, по которым требуется изменение записи. sort: Определяет, какой документ должен быть изменен, когда критерии выбора возвращают несколько документов. new: указывает, что измененный документ будет отображен. fields: указывает набор полей, которые должны быть возвращены. upsert: создает новый документ, если критерии выбора не удается извлечь документ.

Важные моменты при использовании findAndModify в MongoDB

Некоторые вещи, которые стоит иметь в виду при использовании вызовов findAndModify в MongoDB:

  • Если введенные критерии выборки не извлекают ни одного документа, и если upsert установлен в значение true, то указанные значения вставляются, и создается новый документ.
  • Если введенные критерии выборки не извлекают ни одного документа во время выполнения операций обновления или удаления, возвращаемый результат равен нулю.
  • Если новая опция установлена в значение false, и операция сортировки не указана, возвращаемый результат равен нулю.
  • Если новая опция установлена в значение false, и операция сортировки указана, результат пуст.

Пример findAndModify в MongoDB

Теперь давайте рассмотрим несколько примеров, демонстрирующих использование API findAndModify. Сначала давайте создадим некоторые тестовые данные для начала работы. Мы создадим новый документ автомобиля с полями name, color, car no (cno), speed и manufactured country (mfdcountry) через консоль mongo.

db.car.insert(
[
{ _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
{ _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
{ _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
]
)

Давайте теперь проверим, были ли данные действительно вставлены, используя поиск mongodb:

db.car.find()
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }

Перейдем к фактическому использованию find и modify, мы покажем различные возможности. Случай 1: Документ существует в базе данных

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. Сортировка упорядочивает результаты запроса в порядке возрастания. Если несколько документов соответствуют условиям запроса, метод выберет для модификации первый документ в порядке, определенном этой сортировкой.
  2. Обновление увеличивает значение поля “speed” на 10.
  3. Метод возвращает исходный документ, выбранный для этого обновления:

Вывод:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}

Сценарий 2: Новая опция установлена в true (возвращает обновленный набор данных)

db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})

Вывод:

{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}

Обратите внимание, что скорость отображается как 45, что является обновленным значением, поскольку мы установили новое значение в true. Если это не установлено, поле скорости будет показано как 20, старое значение, хотя оно обновляется в базе данных. Сценарий 3: Upsert установлен в true

db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})

Вывод:

db.car.find();
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }

Имя автомобиля с WagonR отсутствует в базе данных, поэтому создается новый документ в базе данных. Метод возвращает пустой документ { }, если указана опция сортировки. Если опция сортировки не включена, метод возвращает null. Кроме того, это также можно использовать для сортировки и удаления. Если поле удаления установлено в true, имя автомобиля с указанными критериями будет удалено из базы данных.

db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)

Вывод:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}

Поле удаления установлено в true, и документ с именем “Alto” удаляется из базы данных.

MongoDB findAndModify Java Example

Операции, изображенные выше, все выполняются вручную с использованием оболочки mongo. То же самое можно сделать программно на Java, как показано ниже. Сначала загрузите драйвер mongo и добавьте его в свой classpath. Сначала нам нужно установить соединение с сервером mongodb, используя клиент Mongo. Имя базы данных должно быть указано для соединения в качестве параметра. Если база данных не существует, будет создана новая. После этого мы добавим несколько записей в базу данных, выполним операцию findAndModify, а затем проверим, действительно ли записи обновлены. Ниже приведена программа, которая работает с версиями драйвера mongo java 2.x.

package com.journaldev.mongodb;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class MongoDBFindAndModify {

	public static void main(String[] args) throws UnknownHostException {
		 // Получить новое соединение с БД, предполагая, что оно запущено. 
		MongoClient mongoClient = new MongoClient("localhost");
		 // используйте test в качестве базы данных. Используйте вашу базу данных здесь. 
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		 // вставьте некоторые тестовые данные для начала. 
		BasicDBObject obj = new BasicDBObject();
		obj.append("name", "Volkswagen");
		obj.append("color", "JetBlue");
		obj.append("cno", "H672");
		obj.append("speed", 62);
		obj.append("mfdcountry", "Italy");
		coll.insert(obj);
		
		 // операция findAndModify. Обновить цвет на синий для автомобилей со скоростью < 45 
		 // < 45 
		DBObject query = new BasicDBObject("speed",
				new BasicDBObject("$lt", 45));
		DBObject update = new BasicDBObject();
		update.put("$set", new BasicDBObject("color", "Blue"));
		DBCursor cursor = coll.find();
		try {
			while (cursor.hasNext()) {
				System.out.println(cursor.next());
			}
		} finally {
			cursor.close();
		}
		coll.findAndModify(query, update);
	}
}

Вывод:

 // Тестовые данные перед вставкой 
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}


 // Тестовые данные после вставки 
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}


/*Test Data Before findandModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}


/*Test Data After findAndModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}

Если вы используете версии MongoDB java driver 3.x, то используйте следующую программу.

package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
 
public class MongoDBFindAndModify {
 
    public static void main(String[] args) throws UnknownHostException {
         // Получить новое соединение с БД, предполагая, что оно запущено. 
        MongoClient mongoClient = new MongoClient("localhost");
        
         // используйте test в качестве базы данных. Используйте вашу базу данных здесь. 
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
         // вставьте некоторые тестовые данные для начала. 
        Document obj = new Document();
        obj.append("name", "Volkswagen");
        obj.append("color", "JetBlue");
        obj.append("cno", "H672");
        obj.append("speed", 62);
        obj.append("mfdcountry", "Italy");
        coll.insertOne(obj);
         
         // операция findAndModify. Обновить цвет на синий для автомобилей со скоростью > 45
        Bson query = new Document("speed",
                new Document("$gt", 45));
        Bson update = new Document("$set", 
        			new Document("color", "Blue"));
        
        System.out.println("before update");
        findAndPrint(coll);
        
        coll.findOneAndUpdate(query, update);
        
        System.out.println("after update of color field");
        findAndPrint(coll);
        
        mongoClient.close();

    }

	private static void findAndPrint(MongoCollection coll) {
		FindIterable cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}

Ниже изображение показывает вывод вышеуказанной программы, обратите внимание на изменение в поле цвета. Это все для примера findAndModify в MongoDB, мы рассмотрим более много операций MongoDB в предстоящих сообщениях. Ссылка: Официальная документация MongoDB

Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example