1. Visão geral
MongoDB é um banco de dados NoSQL orientado a documentos que está disponível publicamente. Podemos atualizar os documentos em uma coleção usando vários métodos como update , substituir e salvar . Para alterar um campo específico do documento, usaremos diferentes operadores como $set , $inc, etc.
Neste tutorial, aprenderemos a modificar os vários campos de um documento usando o método update e substituir inquerir. Para fins de demonstração, discutiremos primeiro a consulta do shell mongo e, em seguida, sua implementação correspondente em Java.
Vamos agora olhar para os vários métodos para atingir o objetivo.
2. Consulta de shell para atualizar campos diferentes
Antes de começarmos, vamos primeiro criar um novo banco de dados, baeldung , e uma coleção de amostras, funcionário . Usaremos essa coleção em todos os exemplos:
use baeldung;
db.createCollection(employee);
Vamos agora adicionar alguns documentos a esta coleção usando o insertMany inquerir:
db.employee.insertMany([
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Representative",
"department_id": 2,
"salary": 20000,
"hire_date": NumberLong("1643969311817")
},
{
"employee_id": 794876,
"employee_name": "Joe Butler",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1645338658000")
}
]);
Como resultado, obteremos um JSON com ObjectId para ambos os documentos, conforme mostrado abaixo:
{
"acknowledged": true,
"insertedIds": [
ObjectId("6211e034b76b996845f3193d"),
ObjectId("6211e034b76b996845f3193e")
]
}
Até agora, configuramos o ambiente necessário. Vamos agora atualizar os documentos que acabamos de inserir.
2.1. Atualizar vários campos de um único documento
Podemos usar $set e $inc operadores para atualizar qualquer campo no MongoDB. O $conjunto operador irá definir o valor recém-especificado enquanto o $inc operador irá aumentar o valor por um valor especificado.
Vamos primeiro examinar a consulta do MongoDB para atualizar dois campos da coleção de funcionários usando o $set operador:
db.employee.updateOne(
{
"employee_id": 794875,
"employee_name": "David Smith"
},
{
$set:{
department_id:3,
job:"Sales Manager"
}
}
);
Na consulta acima, o employee_id e employee_name campo é usado para filtrar o documento e o $set operador é usado para atualizar o job e department_id Campos.
Também podemos usar o $set e $inc operadores juntos em uma única consulta de atualização:
db.employee.updateOne(
{
"employee_id": 794875
},
{
$inc: {
department_id: 1
},
$set: {
job: "Sales Manager"
}
}
);
Isso atualizará o trabalho campo para Gerente de vendas e aumente o department_id por 1.
2.2. Atualizar vários campos de vários documentos
Além disso, também podemos atualizar vários campos de mais de um documento no MongoDB. Nós simplesmente precisamos incluir a opção multi:true para modificar todos os documentos que correspondem aos critérios de consulta do filtro:
db.employee.update(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
},
{
multi: true
}
);
Como alternativa, obteremos os mesmos resultados usando o updateMany inquerir:
db.employee.updateMany(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
}
);
Na consulta acima, usamos o updateMany método para atualizar mais de 1 documento da coleção.
2.3. Problema comum ao atualizar vários campos
Até agora, aprendemos a atualizar vários campos usando a consulta de atualização fornecendo dois operadores diferentes ou usando um único operador em vários campos.
Agora, se usarmos um operador várias vezes com campos diferentes em uma única consulta, o MongoDB atualizará apenas a última instrução da consulta de atualização e ignore o resto:
db.employee.updateMany(
{
"employee_id": 794875
},
{
$set: {
department_id: 3
},
$set: {
job:"Sales Manager"
}
}
);
A consulta acima retornará uma saída semelhante a esta:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Nesse caso, o único trabalho será atualizado para “Gerente de Vendas”. O department_id valor não será atualizado para 3.
3. Atualizar campos com driver Java
Até agora, discutimos as consultas brutas do MongoDB. Vamos agora realizar as mesmas operações usando Java. O driver Java do MongoDB suporta duas classes para representar um documento do MongoDB, com.mongodb.BasicDBObject e org.bson.Document. Analisaremos os dois métodos para atualizar campos em um documento.
Antes de prosseguirmos, vamos primeiro nos conectar ao funcionário coleção dentro do baeldung DB:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");
Aqui assumimos que o MongoDB está sendo executado localmente na porta padrão de 27017.
3.1. Usando DBObject
Para criar o documento no MongoDB, usaremos o com.mongodb. Interface DBObject e sua classe de implementação com.mongodb.BasicDBObject .
A implementação do DBObject é baseado em pares de valores-chave. O BasicDBObject é herdado do LinkedHashMap classe que está no util pacote.
Vamos agora usar o com.mongodb.BasicDBObject para realizar a operação de atualização em vários campos:
BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);
Aqui, primeiro, criamos uma consulta de filtro com base no employee_id. Esta operação retornará um conjunto de documentos. Além disso, atualizamos o valor do department_id e trabalho de acordo com a consulta definida.
3.2. Usando bson Documento
Podemos realizar todas as operações do MongoDB usando o bson documento. Para isso, primeiro precisamos do objeto de coleção e depois realizamos a operação de atualização usando o updateMany método com o filtro e definir funções.
UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));
Aqui, estamos passando um filtro de consulta para o updateMany método. O eq filtro corresponde a employee_id com o texto correspondente exato '794875'. Em seguida, atualizamos o department_id e o trabalho usando o conjunto operador.
4. Usando a consulta de substituição
A abordagem ingênua para atualizar os vários campos de um documento é substituí-lo por um novo documento que tenha valores atualizados.
Por exemplo, se desejarmos substituir um documento por employee_id 794875, podemos executar a seguinte consulta:
db.employee.replaceOne(
{
"employee_id": 794875
},
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1643969311817")
}
);
O comando acima imprimirá um JSON de confirmação na saída:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Aqui, o employee_id campo é usado para filtrar o documento. O segundo argumento da consulta de atualização indica o documento do qual o documento existente será substituído.
Na consulta acima, estamos realizando replaceOne , portanto, ele substituirá apenas um único documento por esse filtro. Como alternativa, se quisermos substituir todos os documentos por essa consulta de filtro, precisaríamos usar o updateMany método.