Introduktion
Når du bruger MongoDB, vil du bruge det meste af din tid på at administrere dokumenter på en eller anden måde. Uanset om du opretter nye dokumenter og føjer dem til samlinger, henter dokumenter, opdaterer data eller beskærer forældede genstande, er dokumenter i centrum af MongoDB-modellen.
I denne vejledning dækker vi, hvad MongoDB-dokumenter er, og dækker derefter de almindelige operationer, du sandsynligvis skal vide om for at administrere et dokumentcentreret miljø.
Hvad er MongoDB-dokumenter?
I MongoDB er alle data i databaser og samlinger gemt i dokumenter. Da samlinger ikke specificerer et påkrævet skema som standard, kan dokumenter i en samling indeholde en vilkårligt kompleks struktur og behøver ikke matche det format, der bruges af søskendedokumenter. Dette giver en utrolig fleksibilitet og gør det muligt for skemaet at udvikle sig organisk, efterhånden som applikationskravene ændres.
MongoDB-dokumenter bruger selv BSON-dataserialiseringsformatet, en binær repræsentation af JSON JavaScript Object Notation. Dette giver en organiseret struktur med definerede datatyper, der kan forespørges og betjenes programmatisk.
BSON-dokumenter er repræsenteret af et par krøllede seler ({}
), som indeholder nøgleværdi-par. I BSON er disse datakupletter kendt som feltet og dens værdi . Feltet kommer først og er repræsenteret af en streng. Værdien kan være en hvilken som helst gyldig BSON-datatype. Et kolon (:
) adskiller feltet fra dets værdi. Et komma bruges til at adskille hvert felt og hvert værdipar fra hinanden.
Som et eksempel er her et gyldigt BSON-dokument, som MongoDB kan forstå:
{ _id: 80380, vehicle_type: "car", mileage: 7377.80, color: "blue", markets: [ "US", "UK" ], options: { transmission: "automatic", num_doors: 4, power_windows: true }}
Her kan vi se en hel del typer:
_id
er et heltalvehicle_type
ogcolor
er strengemileage
er en flydermarkets
er en række strengeoptions
indeholder et indlejret dokument med værdier bestående af en streng, et heltal og en boolesk
På grund af denne fleksibilitet er dokumenter et ret fleksibelt medium til lagring af data. Nye felter kan nemt tilføjes, dokumenter kan indlejres i hinanden, og den strukturelle kompleksitet matcher nøjagtigt de data, der lagres.
Sådan opretter du nye dokumenter
For at oprette et nyt dokument skal du skifte til en database, hvor du vil gemme det oprettede dokument. Vi bruger en school
database til demonstrationsformål i denne artikel:
use school
Du vil også vælge den samling, hvor du vil indsætte dokumenterne. Som med databaser behøver du ikke eksplicit at oprette den samling, hvor du vil indsætte dokumentet. MongoDB vil automatisk oprette det, når de første data er skrevet. Til dette eksempel vil vi bruge en samling kaldet students
.
Nu hvor du ved, hvor dokumentet vil blive gemt, kan du indsætte et nyt dokument ved hjælp af en af følgende metoder.
Brug af insert()
metode
insert()
metode giver dig mulighed for at indsætte et eller flere dokumenter i den samling, den kaldes på.
For at indsætte et enkelt dokument skal du videregive dokumentet til metoden ved at kalde det på samlingen. Her indsætter vi et nyt dokument for en elev ved navn Ashley:
db.students.insert( { first_name: "Ashley", last_name: "Jenkins", dob: new Date("January 08, 2003"), grade_level: 8 })
WriteResult({ "nInserted" : 1 })
Hvis du vil indsætte mere end et dokument på samme tid, i stedet for at sende et dokument til insert()
, videregive en række dokumenter. Vi kan tilføje to nye dokumenter til elever ved navn Brian og Leah:
db.students.insert( [ { first_name: "Brian", last_name: "McMantis", dob: new Date("September 18, 2010"), grade_level: 2 }, { first_name: "Leah", last_name: "Drake", dob: new Date("October 03, 2009") } ])
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ]})
Da vi udførte en masseskriveoperation, er vores returværdi et BulkWriteResult
i stedet for WriteResult
objekt, vi så før.
Mens insert()
metoden er fleksibel, den er blevet forældet i mange MongoDB-drivere til fordel for følgende to metoder.
Brug af insertOne()
metode
insertOne()
metode kan bruges til at indsætte et enkelt dokument. I modsætning til insert()
metode, kan den kun indsætte ét dokument ad gangen, hvilket gør dens adfærd en smule mere forudsigelig.
Syntaksen er den samme, som når du bruger insert()
for at tilføje et enkelt dokument. Vi kan tilføje en anden elev ved navn Naomi:
db.students.insertOne( { first_name: "Naomi", last_name: "Pyani" })
{ "acknowledged" : true, "insertedId" : ObjectId("60e877914655cbf49ff7cb86")}
I modsætning til med insert()
, insertOne()
metode returnerer et dokument, der indeholder nogle yderligere nyttige oplysninger. Den bekræfter, at skrivningen blev bekræftet af klyngen, og den inkluderer det objekt-id, der blev tildelt dokumentet, da vi ikke har leveret et.
Brug af insertMany()
metode
For at dække scenarier, hvor du ønsker at indsætte flere dokumenter på én gang, skal insertMany()
metoden anbefales nu. Ligesom når du indsætter flere dokumenter med insert()
, insertMany()
tager en række dokumenter.
Vi kan tilføje tre nye elever ved navn Jasmine, Michael og Toni:
db.students.insertMany( [ { first_name: "Jasmine", last_name: "Took", dob: new Date("April 11, 2011") }, { first_name: "Michael", last_name: "Rodgers", dob: new Date("February 25, 2008"), grade_level: 6 }, { first_name: "Toni", last_name: "Fowler" } ])
{ "acknowledged" : true, "insertedIds" : [ ObjectId("60e8792d4655cbf49ff7cb87"), ObjectId("60e8792d4655cbf49ff7cb88"), ObjectId("60e8792d4655cbf49ff7cb89") ]}
Som med insertOne()
, insertMany()
returnerer et dokument, som bekræfter skrivningen og giver et array, der indeholder de id'er, der er blevet tildelt til de indsatte dokumenter.
Sådan forespørger du efter eksisterende dokumenter
Forespørgsel efter dokumenter er et ret omfattende emne, der berettiger sin egen artikel. Du kan finde detaljer om, hvordan du formulerer forespørgsler for at hente forskellige typer dokumenter i vores guide til forespørgsel om data i MongoDB.
Selvom detaljerne bedst efterlades i artiklen, der er linket ovenfor, kan vi i det mindste dække de metoder, som MongoDB giver til at forespørge på dokumenter. Den vigtigste måde at hente dokumenter fra MongoDB på er ved at kalde find()
metode på den pågældende samling.
For eksempel for at indsamle alle dokumenter fra students
, kan du kalde find()
uden argumenter:
db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }
For at gøre outputtet mere læsbart, kan du også sammenkæde pretty()
metode efter find()
:
db.<collection>.find().pretty()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8}{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2}{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z")}{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani"}{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z")}{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6}{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler"}
Du kan se, at en _id
felt er blevet tilføjet til hvert af dokumenterne. MongoDB kræver et unikt _id
for hvert dokument i en samling. Hvis du ikke angiver en ved oprettelse af objekter, tilføjer den en til dig. Du kan bruge dette ID til at hente et enkelt objekt pålideligt:
db.students.find( { _id : ObjectId("60e8792d4655cbf49ff7cb89") })
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }
Du kan finde ud af mere om forskellige måder at forespørge data på med artiklen, der er linket til ovenfor.
Sådan opdaterer du eksisterende dokumenter
Mange eller de fleste use cases for databaser kræver, at du er i stand til at ændre eksisterende data i databasen. Et felt skal muligvis opdateres for at afspejle en ny værdi, eller du skal muligvis tilføje yderligere oplysninger til et eksisterende dokument, efterhånden som det bliver tilgængeligt.
MongoDB bruger et par relaterede metoder til at opdatere eksisterende dokumenter:
updateOne()
:Opdaterer et enkelt dokument i en samling baseret på det medfølgende filter.updateMany()
:Opdaterer flere dokumenter inden for en samling, der matcher det angivne filter.replaceOne()
:Erstatter et helt dokument i en samling baseret på det medfølgende filter.
Vi vil dække, hvordan man bruger hver af disse varianter til at udføre forskellige typer opdateringer.
Opdater operatorer
Før vi tager et kig på hver af metoderne til at opdatere dokumenter, bør vi gennemgå nogle af de tilgængelige opdateringsoperatører.
$currentDate
:Indstiller et felts værdi til den aktuelle dato, enten som dato- eller tidsstempeltype.- Syntaks:
{ $currentDate: { <field>: <type>, ... } }
- Syntaks:
$inc
:Øger et felts værdi med et bestemt beløb.- Syntaks:
{ $inc: { <field>: <amount>, ... } }
- Syntaks:
$min
:Opdaterer et felts værdi, hvis den angivne værdi er mindre end den aktuelle værdi.- Syntaks:
{ $min: { <field>: <value>, ... } }
- Syntaks:
$max
:Opdaterer et felts værdi, hvis den angivne værdi er mere end den aktuelle værdi.- Syntaks:
{ $max: { <field>: <value>, ... } }
- Syntaks:
$mul
:Opdaterer et felts værdi ved at gange det med det givne tal.- Syntaks:
{ $mul: { <field>: <value>, ... } }
- Syntaks:
$rename
:Omdøber et feltnavn til en ny identifikator.- Syntaks:
{ $rename: { <field>: <new_name>, ... } }
- Syntaks:
$set
:Erstatter værdien af et felt med den givne værdi.- Syntaks:
{ $set: { <field>: value, ... } }
- Syntaks:
$setOnInsert
:Angiver værdien af et felt under upsert-handlinger, hvis der oprettes et nyt dokument og ikke gør noget andet.- Syntaks:
{ $setOnInsert: { <field>: <value>, ... } }
- Syntaks:
$unset
:Fjerner et felt fra dokumentet.- Syntaks:
{ $unset: { <field>: "", ... } }
- Syntaks:
$
:En pladsholder for det første array-element, der opfylder forespørgslen.- Syntaks:
{ <update_operator>: {<array>.$: <value> } }
- Syntaks:
$[]
:En pladsholder for alle array-elementer, der opfylder forespørgslen.- Syntaks:
{ <update_operator>: { <array>.$[]: <value> } }
- Syntaks:
$addToSet
:Tilføjer værdier til arrayet, medmindre de allerede er til stede.- Syntaks:
{ $addToSet: { <field>: <value>, ... } }
- Syntaks:
$pop
:Fjerner det første eller sidste element i et array.- Syntaks:
{ $pop: { <field>: (-1 or 1), ... } }
- Syntaks:
$pull
:Fjerner alle elementer i et array, der matcher en betingelse.- Syntaks:
{ $pull: { <field>: <condition>, ... } }
- Syntaks:
$push
:Tilføjer en værdi til en matrix.- Syntaks:
{ $push: { <field>: <value>, ... } }
- Syntaks:
$pullAll
:Fjerner alle de angivne elementer fra et array.- Syntaks:
{ $pullAll: { <field>: [ <value>, ... ], ...} }
- Syntaks:
$each
:Ændrer$addToSet
og$push
operatorer, så de tilføjer hvert element i et array i stedet for et array som et enkelt element.- Syntaks:
{ <update_operator>: { <field>: { $each: [ <value>, ... ] }, ... } }
- Syntaks:
$position
:Bruges med$each
og angiver positionen$push
operatør skal indsætte ved.- Syntaks:
{ $push: { <field>: { $each: [ <value>, ... ], $position: <num> } } }
- Syntaks:
$slice
:Bruges med$each
og$push
for at begrænse antallet af samlede elementer i arrayet.- Syntaks:
{ $push: { <field>: { $each: [ <value>, ... ], $slice: <num> } } }
- Syntaks:
$sort
:Bruges med$each
og$push
at sortere array-elementer.- Syntaks:
{ $push: { <field>: { $each: [ <value>, ... ], $sort: <sort_order> } } }
- Syntaks:
Disse forskellige opdateringsoperatører giver dig mulighed for at opdatere forskellige felter i dine dokumenter på forskellige måder.
Opdatering af et enkelt dokument i en samling
MongoDB's updateOne()
metode bruges til at opdatere et enkelt dokument i en samling. Metoden tager to påkrævede argumenter samt et dokument, der angiver valgfrie argumenter.
Det første argument er et dokument, der specificerer de filterbetingelser, der vil blive brugt til at vælge dokumenter. Siden updateOne()
metoden ændrer højst ét dokument i en samling, det første dokument, der opfylder filterbetingelserne, vil blive brugt.
Det andet argument angiver den opdateringsoperation, der skal udføres. Ovenstående opdateringshandlinger kan specificeres her for at ændre indholdet af det matchede dokument.
Det tredje argument er et dokument med forskellige muligheder for at ændre metodens adfærd. De vigtigste potentielle værdier er:
upsert
:Gør operationen til en upsert-procedure ved at indsætte et nyt dokument, hvis filteret ikke matcher nogen eksisterende dokumenter.collation
:Et dokument, der definerer sprogspecifikke regler, der skal gælde for operationen.
Som et eksempel kan vi opdatere en enkelt elevpost, som vi filtrerer efter _id
felt for at sikre, at vi målretter mod det korrekte dokument. Vi kan indstille grade_level
til en ny værdi:
db.students.updateOne( { _id: ObjectId("60e8792d4655cbf49ff7cb89") }, { $set: { grade_level: 3 } })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Opdatering af flere dokumenter i en samling
MongoDB's updateMany()
metoden virker på samme måde som updateOne()
metode, men i stedet opdaterer ethvert dokument, der matcher det givne filter i stedet for at stoppe efter det første match.
updateMany()
syntaks følger nøjagtigt updateOne()
syntaks, så den eneste forskel er omfanget af operationen.
For eksempel, hvis vi ønsker at ændre alle forekomster af "komposition" til "skrivning" i subjects
array i vores teachers
indsamlingsdokumenter, kunne vi bruge noget som dette:
db.teachers.updateMany( { subject: "composition" }, { $set: { "subjects.$": "writing" } })
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Hvis du tjekker dokumenterne, burde hver forekomst af "komposition" være blevet erstattet med "skrivning":
db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Nancy", "last_name" : "Smith", "subjects" : [ "vocabulary", "pronunciation" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }
Erstatning af et dokument
replaceOne()
metoden virker på samme måde som updateOne()
metode, men erstatter hele dokumentet i stedet for at opdatere individuelle felter. Syntaksen er den samme som de to foregående kommandoer.
For eksempel, hvis Nancy Smith forlader din skole, og du erstatter hende med en lærer ved navn Clara Newman, som underviser i litteratur, kan du skrive følgende:
db.teachers.replaceOne( { $and: [ { first_name: "Nancy" }, { last_name: "Smith" } ] }, { first_name: "Clara", last_name: "Newman", subjects: [ "literature" ] })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Du kan se, at det matchede dokument er blevet fjernet, og at det angivne dokument har erstattet det:
db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Clara", "last_name" : "Newman", "subjects" : [ "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }
Sådan sletter du dokumenter
Fjernelse af dokumenter fra samlinger er også en del af dokumentets livscyklus. For at fjerne et dokument kan du bruge deleteOne()
eller deleteMany()
metoder. De har den samme syntaks og adskiller sig kun i, hvor mange dokumenter de opererer på.
For det meste er alt, hvad du skal gøre for at slette dokumenter med en af disse metoder, at forsyne det med et filterdokument, der specificerer, hvordan du ønsker at vælge det dokument, der skal slettes. deleteOne()
metoden vil højst slette ét dokument (uanset hvor mange matches filteret producerer), mens deleteMany()
metoden sletter hvert dokument, der matcher filterbetingelserne.
For at slette en enkelt elev kan du f.eks. angive et _id
for at matche dem eksplicit:
db.students.deleteOne({ _id: ObjectId("60e8792d4655cbf49ff7cb87")})
{ "acknowledged" : true, "deletedCount" : 1 }
Hvis vi ønsker at slette en elev, der ikke har tildelt et klassetrin, kan vi bruge deleteMany()
metode i stedet:
db.students.deleteMany({ grade_level: { $eq: null }})
{ "acknowledged" : true, "deletedCount" : 2 }
Hvis vi tjekker, skulle vi se, at alle de resterende elever har fået tildelt et klassetrin:
db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler", "grade_level" : 3 }
Konklusion
At lære at oprette, forespørge efter, opdatere og fjerne dokumenter giver dig de færdigheder, du har brug for til effektivt at administrere dokumenter i MongoDB på daglig basis. At blive fortrolig med de forskellige dokument- og indsamlingsmetoder og de operatører, der giver dig mulighed for at matche og ændre information, lader dig udtrykke komplekse tanker, som databasesystemet kan forstå.