MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren Sie mehrere Felder in einem MongoDB-Dokument

1. Übersicht

MongoDB ist eine dokumentenorientierte NoSQL-Datenbank, die öffentlich verfügbar ist. Wir können die Dokumente in einer Sammlung mit verschiedenen Methoden wie update aktualisieren , ersetzen und speichern . Um ein bestimmtes Feld des Dokuments zu ändern, verwenden wir verschiedene Operatoren wie $set , $ink, usw.

In diesem Tutorial erfahren wir, wie Sie die mehreren Felder eines Dokuments mithilfe von Update ändern und das Ersetzen Anfrage. Zu Demonstrationszwecken besprechen wir zuerst die Mongo-Shell-Abfrage und dann ihre entsprechende Implementierung in Java.

Sehen wir uns nun die verschiedenen Methoden an, um den Zweck zu erreichen.

2. Shell-Abfrage zum Aktualisieren verschiedener Felder

Bevor wir beginnen, erstellen wir zuerst eine neue Datenbank, baeldung , und eine Beispielsammlung, Mitarbeiter . Wir verwenden diese Sammlung in allen Beispielen:

use baeldung;
db.createCollection(employee);

Lassen Sie uns nun einige Dokumente zu dieser Sammlung hinzufügen, indem wir insertMany verwenden Abfrage:

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

Als Ergebnis erhalten wir eine JSON mit ObjectId für beide Dokumente, wie unten gezeigt:

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

Bisher haben wir die erforderliche Umgebung eingerichtet. Aktualisieren wir nun die soeben eingefügten Dokumente.

2.1. Mehrere Felder eines einzelnen Dokuments aktualisieren

Wir können $set verwenden und $inc Operatoren, um jedes Feld in MongoDB zu aktualisieren. Das $set Der Operator setzt den neu angegebenen Wert, während $inc Der Operator erhöht den Wert um einen bestimmten Wert.

Schauen wir uns zuerst die MongoDB-Abfrage an, um zwei Felder der Mitarbeitersammlung mit $set zu aktualisieren Betreiber:

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

In der obigen Abfrage die employee_id und employee_name wird zum Filtern des Dokuments und des $set verwendet -Operator wird verwendet, um den Job zu aktualisieren und department_id Felder.

Wir können auch das $set verwenden und $inc Operatoren zusammen in einer einzigen Aktualisierungsabfrage:

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

Dadurch wird der Job aktualisiert Feld an Sales Manager und erhöhen Sie die department_id um 1.

2.2. Mehrere Felder mehrerer Dokumente aktualisieren

Darüber hinaus können wir auch mehrere Felder von mehr als einem Dokument in MongoDB aktualisieren. Wir müssen lediglich die Option multi:true einfügen um alle Dokumente zu ändern, die den Filterabfragekriterien entsprechen:

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

Alternativ erhalten wir dieselben Ergebnisse mit updateMany Abfrage:

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

In der obigen Abfrage haben wir updateMany verwendet Methode, um mehr als 1 Dokument der Sammlung zu aktualisieren.

2.3. Häufiges Problem beim Aktualisieren mehrerer Felder

Bisher haben wir gelernt, mehrere Felder mit der Aktualisierungsabfrage zu aktualisieren, indem wir zwei verschiedene Operatoren bereitstellen oder einen einzelnen Operator für mehrere Felder verwenden.

Wenn wir nun einen Operator mehrmals mit unterschiedlichen Feldern in einer einzigen Abfrage verwenden, aktualisiert MongoDB nur die letzte Anweisung der Aktualisierungsabfrage und den Rest ignorieren:

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

Die obige Abfrage gibt eine ähnliche Ausgabe wie diese zurück:

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

In diesem Fall der einzige Job wird auf „Sales Manager“ aktualisiert. Die department_id Wert wird nicht auf 3 aktualisiert.

3. Felder mit Java-Treiber aktualisieren

Bisher haben wir die rohen MongoDB-Abfragen besprochen. Lassen Sie uns nun die gleichen Operationen mit Java ausführen. Der MongoDB-Java-Treiber unterstützt zwei Klassen zur Darstellung eines MongoDB-Dokuments, com.mongodb.BasicDBObject und org.bson.Document. Wir werden uns beide Methoden ansehen, um Felder in einem Dokument zu aktualisieren.

Bevor wir fortfahren, verbinden wir uns zuerst mit dem Mitarbeiter Sammlung in der baeldung DB:

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

Hier haben wir angenommen, dass die MongoDB lokal am Standardport 27017 ausgeführt wird.

3.1. Verwendung von DBObject

Um das Dokument in MongoDB zu erstellen, verwenden wir com.mongodb. DBObject-Schnittstelle und ihre Implementierungsklasse com.mongodb.BasicDBObject .

Die Implementierung des DBObject basiert auf Schlüssel-Wert-Paaren. Das BasicDBObject wird von der LinkedHashMap geerbt Klasse, die sich im util befindet Paket.

Lassen Sie uns nun das com.mongodb.BasicDBObject verwenden So führen Sie die Aktualisierungsoperation für mehrere Felder durch:

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

Hier haben wir zunächst eine Filterabfrage auf Basis der employee_id erstellt. Dieser Vorgang gibt eine Reihe von Dokumenten zurück. Außerdem haben wir den Wert der department_id aktualisiert und Job entsprechend der eingestellten Abfrage.

3.2. Verwenden von bson Dokument

Wir können alle MongoDB-Operationen mit bson ausführen dokumentieren. Dafür benötigen wir zuerst das Sammlungsobjekt und führen dann die Aktualisierungsoperation mit updateMany durch Methode mit dem Filter und einstellen Funktionen.

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

Hier übergeben wir einen Abfragefilter an updateMany Methode. Die eq Filter stimmt mit employee_id überein mit dem exakt passenden Text „794875“. Dann aktualisieren wir die department_id und der Job mit dem Satz Betreiber.

4. Verwenden der Ersetzungsabfrage

Der naive Ansatz zur Aktualisierung mehrerer Felder eines Dokuments besteht darin, es durch ein neues Dokument mit aktualisierten Werten zu ersetzen.

Zum Beispiel, wenn wir ein Dokument durch employee_id ersetzen möchten 794875 können wir die folgende Abfrage ausführen:

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

Der obige Befehl druckt ein Bestätigungs-JSON in der Ausgabe:

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

Hier die employee_id Feld wird verwendet, um das Dokument zu filtern. Das zweite Argument der Aktualisierungsabfrage bezeichnet das Dokument, aus dem das vorhandene Dokument ersetzt wird.

In der obigen Abfrage führen wir replaceOne aus , daher wird nur ein einzelnes Dokument mit diesem Filter ersetzt. Wenn wir alternativ alle Dokumente mit dieser Filterabfrage ersetzen möchten, müssten wir updateMany verwenden Methode.