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 } },
})
- A consulta encontra um documento na coleção de carros onde o campo nome tem o valor Alto.
- 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.
- A atualização incrementa o valor do campo de velocidade em 10.
- 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