Exemplo de MongoDB findAndModify()

MongoDB findAndModify() método 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 a opção upsert estiver definida 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 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 falharem em recuperar um documento.

Pontos importantes do findAndModify do MongoDB

Alguns dos pontos a serem considerados ao usar as chamadas findAndModify no MongoDB são:

  • Se os critérios de seleção inseridos não recuperarem nenhum documento e se upsert estiver definido como true, 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, o resultado retornado é nulo.
  • Se a nova opção estiver definida como false e a operação de ordenação não for mencionada, o resultado retornado é nulo.
  • Se a nova opção estiver definida como false e a operação de ordenação for especificada, o resultado é vazio.

Exemplo de findAndModify do MongoDB

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

Passando para o uso real do find and modify, nós 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. Brazilian Portuguese Translation“`
    O método de ordenação classifica os resultados da consulta em ordem ascendente. Se vários documentos atendem à condição da consulta, o método selecionará para modificação o primeiro documento conforme ordenado por essa 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 que a opção “nova” é 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 está 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 ordenação for especificada. Se a opção de ordenaçã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 Classificar e Remover. 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 de findAndModify no MongoDB

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

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. Use 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 você estiver usando as versões 3.x do driver Java do MongoDB, então use 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. Use 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 está a imagem do resultado do programa acima, observe a mudança no campo de cor. Isso é tudo para o exemplo de findAndModify do MongoDB, vamos abordar 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