MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Atualizar vários campos em um documento do MongoDB

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.