Поиск по сайту:

Пример MongoDB findAndModify()


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

MongoDB найти и изменить()

Синтаксис метода findAndModify mongodb следующий.

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

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

MongoDB findAndModify важные моменты

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

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

Пример MongoDB findAndModify

Теперь давайте посмотрим на несколько примеров, демонстрирующих использование API findAndModify. Во-первых, давайте создадим некоторые тестовые данные для начала. Мы создадим новый автомобильный документ с полями имени, цвета, номера автомобиля (cno), скорости и страны производства (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 find :

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" }

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

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})

  1. Запрос находит документ в коллекции автомобилей, где поле имени имеет значение Alto.
  2. Сортировка упорядочивает результаты запроса в порядке возрастания. Если несколько документов удовлетворяют условию запроса, метод выберет для модификации первый документ в соответствии с сортировкой.
  3. Обновление увеличивает значение поля скорости на 10.
  4. Метод возвращает исходный документ, выбранный для этого обновления:

Выход:

{
"_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, документ с именем «Альт» удаляется из базы данных.

MongoDB findAndModify Пример Java

Операции, описанные выше, выполняются вручную с использованием оболочки mongo. То же самое можно сделать программно на Java, как показано ниже. Загрузите jar-файл драйвера mongo и добавьте его в свой путь к классам. Во-первых, нам нужно установить соединение с сервером mongodb с помощью клиента Mongo. Имя базы данных должно быть указано для подключения в качестве параметра. Если база данных не существует, будет создана новая база данных. После этого мы добавим несколько записей в базу данных и выполним операцию findAndModify, а затем проверим, действительно ли записи обновлены. Ниже программа работает с версиями java-драйвера mongo 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 {
		// Get a new connection to the db assuming it is running.
		MongoClient mongoClient = new MongoClient("localhost");
		// use test as the database. Use your database here.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// insert some test data to start with.
		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 operation. Update colour to blue for cars having speed
		// < 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);
	}
}

Выход:

//Test Data Before Insert
{ "_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"}


//Test Data After insert
{ "_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"}

Если вы используете Java-драйвер MongoDB версии 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 {
        // Get a new connection to the db assuming it is running.
        MongoClient mongoClient = new MongoClient("localhost");
        
        // use test as the database. Use your database here.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection<Document> coll = db.getCollection("car");
         
        // insert some test data to start with.
        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 operation. Update color to blue for cars having speed > 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<Document> coll) {
		FindIterable<Document> cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}