1. Oversigt
MongoDB er en dokumentorienteret NoSQL-database, der er offentligt tilgængelig. Vi kan opdatere dokumenterne i en samling ved hjælp af forskellige metoder såsom opdatering , erstat og gem . For at ændre et specifikt felt i dokumentet, bruger vi forskellige operatorer såsom $set , $inc, osv.
I denne øvelse lærer vi at ændre de flere felter i et dokument ved hjælp af opdateringen og erstat forespørgsel. Til demonstrationsformål vil vi først diskutere mongo-shell-forespørgslen og derefter dens tilsvarende implementering i Java.
Lad os nu se nærmere på de forskellige metoder til at opnå formålet.
2. Shell-forespørgsel for at opdatere forskellige felter
Inden vi starter, lad os først oprette en ny database, baeldung , og en prøvesamling, medarbejder . Vi vil bruge denne samling i alle eksemplerne:
use baeldung;
db.createCollection(employee);
Lad os nu tilføje et par dokumenter til denne samling ved hjælp af insertMany forespørgsel:
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")
}
]);
Som et resultat får vi en JSON med ObjectId for begge dokumenter som vist nedenfor:
{
"acknowledged": true,
"insertedIds": [
ObjectId("6211e034b76b996845f3193d"),
ObjectId("6211e034b76b996845f3193e")
]
}
Indtil videre har vi sat det nødvendige miljø op. Lad os nu opdatere de dokumenter, vi lige har indsat.
2.1. Opdater flere felter i et enkelt dokument
Vi kan bruge $set og $inc operatører til at opdatere ethvert felt i MongoDB. $set operatør vil indstille den nyligt angivne værdi, mens $inc operatør vil øge værdien med en specificeret værdi.
Lad os først se på MongoDB-forespørgslen for at opdatere to felter i medarbejdersamlingen ved hjælp af $set operatør:
db.employee.updateOne(
{
"employee_id": 794875,
"employee_name": "David Smith"
},
{
$set:{
department_id:3,
job:"Sales Manager"
}
}
);
I ovenstående forespørgsel, employee_id og medarbejdernavn feltet bruges til at filtrere dokumentet og $set operator bruges til at opdatere jobbet og department_id felter.
Vi kan også bruge $set og $inc operatører sammen i en enkelt opdateringsforespørgsel:
db.employee.updateOne(
{
"employee_id": 794875
},
{
$inc: {
department_id: 1
},
$set: {
job: "Sales Manager"
}
}
);
Dette vil opdatere jobbet feltet til salgschef og øg afdelings-id inden 1.
2.2. Opdater flere felter af flere dokumenter
Derudover kan vi også opdatere flere felter af mere end ét dokument i MongoDB. Vi skal blot inkludere muligheden multi:true for at ændre alle dokumenter, der matcher filterforespørgselskriterierne:
db.employee.update(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
},
{
multi: true
}
);
Alternativt får vi de samme resultater ved at bruge updateMany forespørgsel:
db.employee.updateMany(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
}
);
I ovenstående forespørgsel brugte vi updateMany metode til at opdatere mere end 1 dokument i samlingen.
2.3. Almindelig problem under opdatering af flere felter
Indtil videre har vi lært at opdatere flere felter ved hjælp af opdateringsforespørgslen ved at angive to forskellige operatører eller bruge en enkelt operatør på flere felter.
Nu, hvis vi bruger en operator flere gange med forskellige felter i en enkelt forespørgsel, vil MongoDB kun opdatere den sidste sætning af opdateringsforespørgslen og ignorer resten:
db.employee.updateMany(
{
"employee_id": 794875
},
{
$set: {
department_id: 3
},
$set: {
job:"Sales Manager"
}
}
);
Ovenstående forespørgsel vil returnere et lignende output til dette:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
I dette tilfælde er det eneste job vil blive opdateret til "Sales Manager". department_id værdi vil ikke blive opdateret til 3.
3. Opdater felter med Java-driver
Indtil videre har vi diskuteret de rå MongoDB-forespørgsler. Lad os nu udføre de samme operationer ved hjælp af Java. MongoDB Java-driver understøtter to klasser til at repræsentere et MongoDB-dokument, com.mongodb.BasicDBObject og org.bson.Document. Vi vil undersøge begge metoder til at opdatere felter i et dokument.
Før vi fortsætter, lad os først oprette forbindelse til medarbejderen samling inde i baeldung DB:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");
Her har vi antaget, at MongoDB kører lokalt ved standardporten 27017.
3.1. Brug af DBObject
For at oprette dokumentet i MongoDB bruger vi com.mongodb. DBObject-grænseflade og dens implementeringsklasse com.mongodb.BasicDBObject .
Implementeringen af DBObject er baseret på nøgleværdi-par. BasicDBObject er arvet fra LinkedHashMap klasse, som er i util pakke.
Lad os nu bruge com.mongodb.BasicDBObject for at udføre opdateringen på flere felter:
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);
Her oprettede vi først en filterforespørgsel på basis af employee_id. Denne handling returnerer et sæt dokumenter. Yderligere har vi opdateret værdien af department_id og job i henhold til den indstillede forespørgsel.
3.2. Bruger bson Dokument
Vi kan udføre alle MongoDB-operationer ved hjælp af bson dokument. Til det skal vi først have samlingsobjektet og derefter udføre opdateringshandlingen ved hjælp af updateMany metode med filteret og indstil funktioner.
UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));
Her sender vi et forespørgselsfilter til updateMany metode. eq filter matcher employee_id med den nøjagtige matchende tekst '794875'. Derefter opdaterer vi department_id og jobbet ved hjælp af sættet operatør.
4. Brug af Erstat forespørgsel
Den naive tilgang til at opdatere de flere felter i et dokument er at erstatte det med et nyt dokument, der har opdaterede værdier.
For eksempel, hvis vi ønsker at erstatte et dokument med medarbejder_id 794875, kan vi udføre følgende forespørgsel:
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")
}
);
Ovenstående kommando vil udskrive en bekræftelses-JSON i outputtet:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Her er employee_id feltet bruges til at filtrere dokumentet. Det andet argument i opdateringsforespørgslen angiver det dokument, hvorfra det eksisterende dokument vil blive erstattet.
I ovenstående forespørgsel udfører vi replaceOne , derfor vil det kun erstatte et enkelt dokument med det filter. Alternativt, hvis vi ønsker at erstatte alle dokumenter med den filterforespørgsel, skal vi bruge updateMany metode.