sql >> Database >  >> NoSQL >> MongoDB

Meerdere velden in een MongoDB-document bijwerken

1. Overzicht

MongoDB is een documentgeoriënteerde NoSQL-database die openbaar beschikbaar is. We kunnen de documenten in een verzameling bijwerken met verschillende methoden, zoals update , vervangen en opslaan . Om een ​​specifiek veld van het document te wijzigen, gebruiken we verschillende operators zoals $set , $inc, enz.

In deze zelfstudie leren we de meerdere velden van een document aan te passen met behulp van de update en de vervangen vraag. Voor demonstratiedoeleinden zullen we eerst de mongo-shell-query bespreken en vervolgens de bijbehorende implementatie in Java.

Laten we nu kijken naar de verschillende methoden om het doel te bereiken.

2. Shell-query om verschillende velden bij te werken

Voordat we beginnen, laten we eerst een nieuwe database maken, baeldung , en een voorbeeldverzameling, werknemer . We gebruiken deze verzameling in alle voorbeelden:

use baeldung;
db.createCollection(employee);

Laten we nu een paar documenten aan deze verzameling toevoegen met behulp van de insertMany vraag:

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 resultaat krijgen we een JSON met ObjectId voor beide documenten zoals hieronder getoond:

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

Tot nu toe hebben we de vereiste omgeving ingericht. Laten we nu de documenten bijwerken die we zojuist hebben ingevoegd.

2.1. Meerdere velden van een enkel document bijwerken

We kunnen $set . gebruiken en $inc operators om elk veld in MongoDB bij te werken. De $set operator zal de nieuw gespecificeerde waarde instellen terwijl de $inc operator zal de waarde verhogen met een gespecificeerde waarde.

Laten we eerst kijken naar de MongoDB-query om twee velden van de werknemersverzameling bij te werken met behulp van de $set operator:

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

In de bovenstaande zoekopdracht, de employee_id en naam werknemer veld wordt gebruikt om het document te filteren en de $set operator wordt gebruikt om de taak bij te werken en department_id velden.

We kunnen ook de $set . gebruiken en $inc operators samen in een enkele update-query:

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

Hiermee wordt de taak bijgewerkt veld naar Sales Manager en verhoog de department_id door 1.

2.2. Update meerdere velden van meerdere documenten

Daarnaast kunnen we ook meerdere velden van meer dan één document in MongoDB bijwerken. We hoeven alleen de optie multi:true . op te nemen om alle documenten te wijzigen die voldoen aan de filterquerycriteria:

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

Als alternatief krijgen we dezelfde resultaten met de updateMany vraag:

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

In de bovenstaande zoekopdracht gebruikten we de updateMany methode om meer dan 1 document van de collectie bij te werken.

2.3. Veelvoorkomend probleem bij het bijwerken van meerdere velden

Tot nu toe hebben we geleerd om meerdere velden bij te werken met behulp van de update-query door twee verschillende operators op te geven of door een enkele operator op meerdere velden te gebruiken.

Als we nu een operator meerdere keren gebruiken met verschillende velden in een enkele query, zal MongoDB alleen de laatste instructie van de updatequery bijwerken en negeer de rest:

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

De bovenstaande query zal een soortgelijke uitvoer als deze retourneren:

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

In dit geval de enige baan wordt bijgewerkt naar 'Verkoopmanager'. De department_id waarde wordt niet bijgewerkt naar 3.

3. Velden bijwerken met Java-stuurprogramma

Tot nu toe hebben we de onbewerkte MongoDB-query's besproken. Laten we nu dezelfde bewerkingen uitvoeren met Java. MongoDB Java-stuurprogramma ondersteunt twee klassen om een ​​MongoDB-document te vertegenwoordigen, com.mongodb.BasicDBObject en org.bson.Document. We zullen beide methoden onderzoeken om velden in een document bij te werken.

Voordat we verder gaan, laten we eerst verbinding maken met de medewerker collectie in de baeldung DB:

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

Hier hebben we aangenomen dat de MongoDB lokaal draait op de standaardpoort 27017.

3.1. DBObject gebruiken

Om het document in MongoDB te maken, gebruiken we de com.mongodb. DBObject-interface en zijn implementatieklasse com.mongodb.BasicDBObject .

De implementatie van het DBObject is gebaseerd op sleutel-waardeparen. Het BasicDBObject is overgenomen van de LinkedHashMap klasse die zich in de util . bevindt pakket.

Laten we nu het com.mongodb.BasicDBObject . gebruiken om de update-bewerking op meerdere velden uit te voeren:

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 hebben we eerst een filterquery gemaakt op basis van de employee_id. Met deze bewerking wordt een set documenten geretourneerd. Verder hebben we de waarde van de department_id . bijgewerkt en baan volgens de ingestelde vraag.

3.2. bson gebruiken Document

We kunnen alle MongoDB-bewerkingen uitvoeren met behulp van de bson document. Daarvoor hebben we eerst het verzamelingsobject nodig en voeren vervolgens de updatebewerking uit met behulp van de updateMany methode met het filter en set functies.

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

Hier geven we een zoekfilter door aan de updateMany methode. De eq filter komt overeen met employee_id met de exact passende tekst '794875'. Vervolgens updaten we de department_id en de baan met behulp van de set telefoniste.

4. Query vervangen gebruiken

De naïeve benadering om de meerdere velden van een document bij te werken, is om het te vervangen door een nieuw document met bijgewerkte waarden.

Als we bijvoorbeeld een document willen vervangen door employee_id 794875, kunnen we de volgende query uitvoeren:

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

De bovenstaande opdracht drukt een bevestigings-JSON af in de uitvoer:

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

Hier, de employee_id veld wordt gebruikt om het document te filteren. Het tweede argument van de update-query geeft het document aan waaruit het bestaande document zal worden vervangen.

In de bovenstaande zoekopdracht voeren we replaceOne uit , daarom zal het slechts één enkel document door dat filter vervangen. Als alternatief, als we alle documenten met die filterquery willen vervangen, moeten we de updateMany gebruiken methode.


  1. Hoe unhideIndex() werkt in MongoDB

  2. Meest populaire NoSQL-databases die worden ondersteund door ClusterControl

  3. Omgaan met schemawijzigingen in Mongoose

  4. Verbinding maken met Redis To Go met PHP