MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiorna più campi in un documento MongoDB

1. Panoramica

MongoDB è un database NoSQL orientato ai documenti disponibile pubblicamente. Possiamo aggiornare i documenti in una raccolta utilizzando vari metodi come aggiornamento , sostituisci e salva . Per modificare un campo specifico del documento, utilizzeremo diversi operatori come $set , $inc, ecc.

In questo tutorial impareremo a modificare i campi multipli di un documento usando l'aggiornamento e il sostituisci interrogazione. A scopo dimostrativo, discuteremo prima la query della shell mongo e poi la sua corrispondente implementazione in Java.

Esaminiamo ora i vari metodi per raggiungere lo scopo.

2. Query Shell per aggiornare campi diversi

Prima di iniziare, creiamo prima un nuovo database, baeldung e una raccolta di campioni, dipendente . Useremo questa raccolta in tutti gli esempi:

use baeldung;
db.createCollection(employee);

Aggiungiamo ora alcuni documenti a questa raccolta utilizzando insertMany domanda:

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")
    }
]);

Di conseguenza, otterremo un JSON con ObjectId per entrambi i documenti come mostrato di seguito:

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

Finora, abbiamo impostato l'ambiente richiesto. Aggiorniamo ora i documenti che abbiamo appena inserito.

2.1. Aggiorna più campi di un singolo documento

Possiamo usare $set e $inc operatori per aggiornare qualsiasi campo in MongoDB. Il $set l'operatore imposterà il valore appena specificato mentre $inc l'operatore aumenterà il valore di un valore specificato.

Diamo prima un'occhiata alla query MongoDB per aggiornare due campi della raccolta dei dipendenti utilizzando $set operatore:

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

Nella query precedente, employee_id e nome_dipendente campo viene utilizzato per filtrare il documento e il $set operatore viene utilizzato per aggiornare il lavoro e id_reparto campi.

Possiamo anche usare il $set e $inc operatori insieme in un'unica query di aggiornamento:

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

Questo aggiornerà il lavoro campo a Sales Manager e aumentare il department_id entro 1.

2.2. Aggiorna più campi di più documenti

Inoltre, possiamo anche aggiornare più campi di più di un documento in MongoDB. Dobbiamo semplicemente includere l'opzione multi:true per modificare tutti i documenti che soddisfano i criteri di ricerca del filtro:

db.employee.update(
    {
        "job": "Sales Representative"
    },
    {
        $inc: { 
            salary: 10000
        }, 
        $set: { 
            department_id: 5
        }
    },
    {
        multi: true 
    }
);

In alternativa, otterremo gli stessi risultati utilizzando updateMany domanda:

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

Nella query precedente, abbiamo utilizzato updateMany metodo per aggiornare più di 1 documento della collezione.

2.3. Problema comune durante l'aggiornamento di più campi

Finora, abbiamo imparato ad aggiornare più campi utilizzando la query di aggiornamento fornendo due operatori diversi o utilizzando un unico operatore su più campi.

Ora, se utilizziamo un operatore più volte con campi diversi in una singola query, MongoDB aggiornerà solo l'ultima istruzione della query di aggiornamento e ignora il resto:

db.employee.updateMany(
    {
        "employee_id": 794875
    },
    {
        $set: {
            department_id: 3
        },
        $set: {
            job:"Sales Manager"
        }
    }
);

La query precedente restituirà un output simile a questo:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

In questo caso, l'unico lavoro sarà aggiornato a “Responsabile vendite”. Il id_reparto il valore non verrà aggiornato a 3.

3. Aggiorna campi con driver Java

Finora, abbiamo discusso delle query MongoDB grezze. Eseguiamo ora le stesse operazioni utilizzando Java. Il driver MongoDB Java supporta due classi per rappresentare un documento MongoDB, com.mongodb.BasicDBObject e org.bson.Document. Esamineremo entrambi i metodi per aggiornare i campi in un documento.

Prima di procedere, connettiamoci al dipendente raccolta all'interno del baeldung DB:

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");

Qui abbiamo presupposto che MongoDB sia in esecuzione localmente sulla porta predefinita 27017.

3.1. Utilizzando DBObject

Per creare il documento in MongoDB, utilizzeremo com.mongodb. Interfaccia DBObject e relativa classe di implementazione com.mongodb.BasicDBObject .

L'implementazione di DBObject si basa su coppie chiave-valore. Il BasicDBObject viene ereditato da LinkedHashMap classe che si trova in util pacchetto.

Usiamo ora com.mongodb.BasicDBObject per eseguire l'operazione di aggiornamento su più campi:

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);

Qui, per prima cosa, abbiamo creato una query di filtro sulla base di employee_id. Questa operazione restituirà una serie di documenti. Inoltre, abbiamo aggiornato il valore di department_id e lavoro secondo la query impostata.

3.2. Utilizzo di bson Documento

Possiamo eseguire tutte le operazioni di MongoDB usando bson documento. Per questo, in primo luogo, abbiamo bisogno dell'oggetto raccolta e quindi eseguiamo l'operazione di aggiornamento utilizzando updateMany metodo con il filtro e imposta funzioni.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Qui stiamo passando un filtro di query a updateMany metodo. L'eq il filtro corrisponde a employee_id con il testo esatto corrispondente '794875'. Quindi, aggiorniamo il department_id e il lavoro utilizzando il set operatore.

4. Utilizzo di Sostituisci query

L'approccio ingenuo per aggiornare i campi multipli di un documento consiste nel sostituirlo con un nuovo documento con valori aggiornati.

Ad esempio, se desideriamo sostituire un documento con employee_id 794875, possiamo eseguire la seguente query:

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")
    }
);

Il comando precedente stamperà un JSON di riconoscimento nell'output:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Qui, l'employee_id campo viene utilizzato per filtrare il documento. Il secondo argomento della query di aggiornamento denota il documento da cui verrà sostituito il documento esistente.

Nella query precedente, stiamo eseguendo replaceOne , quindi, sostituirà solo un singolo documento con quel filtro. In alternativa, se vogliamo sostituire tutti i documenti con quella query di filtro, dovremmo utilizzare updateMany metodo.