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

Push and Set Operations na mesma atualização do MongoDB

1. Visão geral


$push é um operador de atualização no MongoDB que adiciona o valor em uma matriz. Em contraste, o $set operador é usado para atualizar o valor de um campo existente no documento.

Neste breve tutorial, apresentaremos como executar $push e $set operações juntas em uma única consulta de atualização.

2. Inicialização do banco de dados


Antes de prosseguirmos para realizar as várias operações de atualização, primeiro precisamos configurar um banco de dados baeldung e coleta de amostras marcas :
use baeldung;
db.createCollection(marks);

Vamos inserir alguns documentos na coleção marcas usando o insertMany método do MongoDB:
db.marks.insertMany([
    {
        "studentId": 1023,
        "studentName":"James Broad",
        "joiningYear":"2018",
        "totalMarks":100,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":40
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    },
    {
        "studentId": 1024,
        "studentName":"Chris Overton",
        "joiningYear":"2018",
        "totalMarks":110,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":50
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    }
]);

Na inserção bem-sucedida, a consulta acima retornará a seguinte resposta:
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
        ObjectId("622300cc85e943405d04b568")
    ]
}

Até agora, inserimos com sucesso alguns documentos de amostra na coleção marcas .

3. Entendendo o problema


Para entender o problema, vamos primeiro entender o documento que acabamos de inserir. Inclui os detalhes do aluno e as notas obtidas por eles em diferentes disciplinas. O totalMarks  é a soma das notas que são obtidas em diferentes disciplinas.

Vamos considerar uma situação em que desejamos adicionar um novo assunto em subjectDetails variedade. Para também tornar os dados consistentes, precisamos atualizar o totalMarks campo também.

No MongoDB, primeiro, adicionaremos o novo assunto à matriz usando o $push operador. Em seguida, definiremos o totalMarks campo para um valor específico usando o $set operador.

Ambas as operações podem ser realizadas individualmente usando o $push e $set operador, respectivamente. Mas podemos escrever a consulta do MongoDB para realizar as duas operações juntas.

4. Usando a consulta do Shell do MongoDB


No MongoDB, podemos atualizar vários campos de um documento usando os diferentes operadores de atualização. Aqui, usaremos $push e $set operadores juntos em um updateOne inquerir.

Vamos conferir o exemplo que contém ambos $push e $set operadores juntos:
db.marks.updateOne(
    {
        "studentId": 1023
    },
    {
        $set: {
            totalMarks: 170
        },
        $push: {
            "subjectDetails":{
                "subjectId": 126,
                "subjectName": "Java Programming",
                "marks": 70
            }
        }
    }
);

Aqui, na consulta acima, adicionamos a consulta de filtro com base no studentId. Assim que obtivermos o documento filtrado, atualizaremos o totalMarks usando o operador $set. Além disso, inserimos os novos dados do assunto nos subjectDetails array usando o $push operador.

Como resultado, a consulta acima retornará a seguinte saída:
{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Aqui, o matchedCount contém a contagem de documentos que corresponde ao filtro, enquanto o modifiedCount contém o número de documentos modificados.

5. Código do driver Java


Até agora, discutimos a consulta do shell mongo para usar o $push e $set operador juntos. Aqui, aprenderemos a implementar o mesmo usando o código do driver Java.

Antes de prosseguirmos, vamos primeiro nos conectar ao banco de dados e à coleção necessária:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");

Aqui, estamos nos conectando ao MongoDB, que está sendo executado na porta padrão 27017 no host local.

Vamos agora olhar para o código do driver Java:
Document subjectData = new Document()
  .append("subjectId", 126)
  .append("subjectName", "Java Programming")
  .append("marks", 70); 
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023), 
  Updates.combine(Updates.set("totalMarks", 170), 
  Updates.push("subjectDetails", subjectData)));

Neste snippet de código, usamos o updateOne método, que atualiza apenas um único documento com base no filtro aplicado studentId 1023. Em seguida, usamos o Updates.combine para realizar várias operações em uma única chamada. O campo totalMarcas será atualizado para 170, e um novo documento subjectData será enviado para o campo de matriz “subjectDetails” .