Exemplo de MongoDB findAndModify()

O método findAndModify() do MongoDB modifica e retorna um único documento com base nos critérios de seleção inseridos. O documento retornado não mostra o conteúdo atualizado por padrão. Se os registros que correspondem aos critérios não existirem no banco de dados, um novo registro será inserido se o upsert estiver definido como true.

MongoDB findAndModify()

A sintaxe para o método findAndModify do MongoDB é a seguinte.

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

A descrição dos parâmetros é a seguinte. query: Define os critérios de seleção para determinar qual registro precisa ser modificado. sort: Determina qual documento deve ser modificado quando os critérios de seleção recuperam vários documentos. new: indica que o documento modificado será exibido. fields: especifica o conjunto de campos a serem retornados. upsert: cria um novo documento se os critérios de seleção não conseguirem recuperar um documento.

Pontos importantes do findAndModify do MongoDB

Alguns dos pontos a serem observados ao usar as chamadas findAndModify do MongoDB são:

  • Se os critérios de seleção inseridos não recuperarem nenhum documento e se upsert estiver definido como verdadeiro, então os valores especificados são inseridos e um novo documento é criado.
  • Se os critérios de seleção inseridos não recuperarem nenhum documento durante as operações de atualização ou remoção, a saída retornada é nula.
  • Se a nova opção estiver definida como falsa e a operação de ordenação não for mencionada, a saída retornada é nula.
  • Se a nova opção estiver definida como falsa e a operação de ordenação for especificada, a saída estará vazia.

Exemplo de findAndModify do MongoDB

Agora vamos ver alguns exemplos que demonstram o uso da API findAndModify. Primeiro, vamos criar alguns dados de teste para começar. Vamos criar um novo documento de carro com os campos nome, cor, número do carro (cno), velocidade e país de fabricação (mfdcountry) através do console do 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" }
]
)

Vamos agora verificar se os dados foram realmente inseridos usando mongo 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" }

Passando para o uso real de find and modify, representamos diferentes possibilidades. Caso 1: O documento existe no banco de dados

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. A consulta encontra um documento na coleção de carros onde o campo nome tem o valor Alto.
  2. A ordenação classifica os resultados da consulta em ordem crescente. Se vários documentos atendem à condição da consulta, o método selecionará para modificação o primeiro documento conforme ordenado por esta ordenação.
  3. A atualização incrementa o valor do campo de velocidade em 10.
  4. O método retorna o documento original selecionado para esta atualização:

Saída:

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

Caso 2: A nova opção definida como verdadeira (retorna o conjunto de dados atualizado)

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

Saída:

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

Observe que a velocidade está sendo exibida como 45, que é o valor atualizado, pois definimos como verdadeira. Se isso não for definido, o campo de velocidade será exibido como 20, o valor antigo, embora seja atualizado no banco de dados. Caso 3: O upsert é definido como verdadeiro

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

Saída:

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 }

O nome do carro com WagonR não está no banco de dados; portanto, um novo documento é criado no banco de dados. O método retorna um documento vazio { } se a opção de classificação for especificada. Se a opção de classificação não estiver incluída, o método retorna nulo. Além disso, isso também pode ser usado para realizar uma operação de Classificação e Remoção. Se o campo de remoção estiver definido como verdadeiro, o nome do carro com os critérios especificados será removido do banco de dados.

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

Saída:

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

O campo de remoção está definido como verdadeiro, o documento com o nome “Alto” é excluído do banco de dados.

Exemplo Java MongoDB findAndModify

As operações representadas acima são todas realizadas manualmente usando o shell do mongo. O mesmo pode ser feito programaticamente em Java, como mostrado abaixo. Baixe o arquivo JAR do driver do mongo e adicione-o ao seu classpath. Primeiramente, precisamos estabelecer uma conexão com o servidor MongoDB usando o cliente Mongo. O nome do banco de dados deve ser especificado como parâmetro para a conexão. Se o banco de dados não existir, um novo banco de dados será criado. Em seguida, adicionaremos alguns registros ao banco de dados, realizaremos uma operação findAndModify e depois verificaremos se os registros foram realmente atualizados. O programa abaixo funciona com as versões 2.x do driver Java do mongo.

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 {
		// Obtenha uma nova conexão com o banco de dados, presumindo que esteja em execução.
		MongoClient mongoClient = new MongoClient("localhost");
		// Use "test" como o banco de dados. Utilize o nome do seu banco de dados aqui.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// Insira alguns dados de teste para começar.
		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);
		
		// Operação findAndModify. Atualize a cor para azul para carros com velocidade
		// < 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);
	}
}

Output:

//Dados de Teste Antes da Inserção
{ "_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"}


//Dados de Teste Após a Inserção
{ "_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"}

Se estiver usando as versões 3.x do driver MongoDB para Java, utilize o programa abaixo.

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 {
        // Obtenha uma nova conexão com o banco de dados, presumindo que esteja em execução.
        MongoClient mongoClient = new MongoClient("localhost");
        
        // Use "test" como o banco de dados. Utilize o nome do seu banco de dados aqui.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
        // Insira alguns dados de teste para começar.
        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);
         
        // Operação findAndModify. Atualize a cor para azul para carros com velocidade > 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);
	}
}

Abaixo, a imagem mostra a saída do programa acima, observe a mudança no campo de cor. Isso é tudo para o exemplo de findAndModify do MongoDB, vamos examinar mais operações do MongoDB nos próximos posts. Referência: Documentação Oficial do MongoDB

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