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 } },
})
- Сортировка упорядочивает результаты запроса в порядке возрастания. Если несколько документов соответствуют условиям запроса, метод выберет для модификации первый документ в порядке, определенном этой сортировкой.
- Обновление увеличивает значение поля “speed” на 10.
- Метод возвращает исходный документ, выбранный для этого обновления:
Вывод:
{
"_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