MongoDB er en dokumentorienteret og NoSQL-databaseløsning, der giver stor skalerbarhed og fleksibilitet sammen med et kraftfuldt forespørgselssystem. Med MongoDB og Python kan du hurtigt udvikle mange forskellige typer databaseapplikationer. Så hvis din Python-applikation har brug for en database, der er lige så fleksibel som selve sproget, så er MongoDB noget for dig.
I dette selvstudie lærer du:
- Hvad MongoDB er
- Sådan installeres og køres MongoDB
- Sådan arbejder du med MongoDB-databaser
- Sådan bruges PyMongo-driveren på lavt niveau at interface med MongoDB
- Sådan bruger du MongoEngine-objekt-dokumentmapper (ODM) på højt niveau
Igennem denne tutorial vil du skrive et par eksempler, der vil demonstrere fleksibiliteten og kraften i MongoDB og dens fantastiske Python-understøttelse. For at downloade kildekoden til disse eksempler skal du klikke på linket nedenfor:
Hent kildekoden: Klik her for at få den kildekode, du skal bruge til at lære at bruge MongoDB med Python i denne vejledning.
Brug af SQL vs NoSQL-databaser
I årtier var SQL-databaser et af de eneste valg for udviklere, der ville bygge store og skalerbare databasesystemer. Det stigende behov for lagring af komplekse datastrukturer førte dog til fødslen af NoSQL databaser. Denne nye type databasesystem giver udviklere mulighed for at lagre heterogene og strukturløse data effektivt.
Generelt lagrer og henter NoSQL-databasesystemer data på en meget anderledes måde end SQL relationsdatabasestyringssystemer (RDBMS'er).
Når det kommer til at vælge fra de aktuelt tilgængelige databaseteknologier, skal du muligvis vælge mellem at bruge SQL- eller NoSQL-systemer. Begge har specifikke funktioner, som du bør overveje, når du vælger den ene eller den anden. Her er nogle af deres mere væsentlige forskelle:
Ejendom | SQL-databaser | NoSQL-databaser |
---|---|---|
Datamodel | Relationel | Ikke-relationel |
Struktur | Tabelbaseret, med kolonner og rækker | Dokumentbaseret, nøgleværdi-par, graf eller bred kolonne |
Skema | Et foruddefineret og strengt skema, hvor hver post (række) er af samme karakter og har de samme egenskaber | Et dynamisk skema eller skemaløst, hvilket betyder, at poster ikke behøver at være af samme karakter |
Forespørgselssprog | Structured Query Language (SQL) | Varierer fra database til database |
Skalerbarhed | Lodret | Horisontal |
ACID-transaktioner | Understøttet | Understøttet, afhængigt af den specifikke NoSQL-database |
Mulighed for at tilføje nye egenskaber | Du skal først ændre skemaet | Muligt uden at forstyrre noget |
Der er mange andre forskelle mellem de to typer databaser, men dem, der er nævnt ovenfor, er nogle af de vigtigere at vide om.
Når du vælger en database, bør du nøje overveje dens styrker og svagheder. Du skal også overveje, hvordan databasen passer ind i dit specifikke scenarie og din applikations krav. Nogle gange er den rigtige løsning at bruge en kombination af SQL- og NoSQL-databaser til at håndtere forskellige aspekter af et bredere system.
Nogle almindelige eksempler på SQL-databaser omfatter:
- SQLite
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
NoSQL-databaseeksempler inkluderer:
- DynamoDB
- Cassandra
- Redis
- CouchDB
- RethinkDB
- RavenDB
- MongoDB
I de senere år er SQL- og NoSQL-databaser endda begyndt at smelte sammen. For eksempel understøtter databasesystemer, såsom PostgreSQL, MySQL og Microsoft SQL Server, nu lagring og forespørgsel på JSON-data, ligesom NoSQL-databaser. Med dette kan du nu opnå mange af de samme resultater med begge teknologier. Men du får stadig ikke mange af NoSQL-funktionerne, såsom horisontal skalering og den brugervenlige grænseflade.
Med denne korte baggrund om SQL- og NoSQL-databaser kan du fokusere på hovedemnet i denne øvelse:MongoDB-databasen og hvordan man bruger det i Python.
Administration af NoSQL-databaser med MongoDB
MongoDB er en dokument-orienteret database klassificeret som NoSQL. Det er blevet populært i hele branchen i de seneste år og integrerer ekstremt godt med Python. I modsætning til traditionelle SQL RDBMS'er bruger MongoDB samlinger af dokumenter i stedet for tabeller af rækker at organisere og gemme data.
MongoDB gemmer data i skemaløse og fleksible JSON-lignende dokumenter. Her skemaløst betyder, at du kan have dokumenter med et andet sæt felter i den samme samling, uden at du behøver at opfylde et stivt tabel skema .
Du kan ændre strukturen af dine dokumenter og data over tid, hvilket resulterer i et fleksibelt system, der giver dig mulighed for hurtigt at tilpasse dig til kravændringer uden behov for en kompleks datamigreringsproces. Men afvejningen ved at ændre strukturen af nye dokumenter er, at udgående dokumenter bliver inkonsistente med det opdaterede skema. Så dette er et emne, der skal håndteres med omhu.
Bemærk: JSON står for JavaScript Object Notation . Det er et filformat med en struktur, der kan læses af mennesker, bestående af nøgle-værdi-par, der kan indlejres vilkårligt dybt.
MongoDB er skrevet i C++ og aktivt udviklet af MongoDB Inc. Det kører på alle større platforme, såsom macOS, Windows, Solaris og de fleste Linux-distributioner. Generelt er der tre hovedudviklingsmål bag MongoDB-databasen:
- Skaler godt
- Gem rige datastrukturer
- Lav en sofistikeret forespørgselsmekanisme
MongoDB er en distribueret database, så høj tilgængelighed, horisontal skalering og geografisk fordeling er indbygget i systemet. Det gemmer data i fleksible JSON-lignende dokumenter. Du kan modellere disse dokumenter for at kortlægge objekterne i dine applikationer, hvilket gør det muligt at arbejde med dine data effektivt.
MongoDB leverer et kraftfuldt forespørgselssprog, der understøtter ad hoc-forespørgsler, indeksering, aggregering, geospatial søgning, tekstsøgning og meget mere. Dette giver dig et kraftfuldt værktøjssæt til at få adgang til og arbejde med dine data. Endelig er MongoDB frit tilgængelig og har fantastisk Python-understøttelse.
Gennemgang af MongoDBs funktioner
Indtil videre har du lært, hvad MongoDB er, og hvad dets hovedmål er. I dette afsnit lærer du om nogle af MongoDBs mere vigtige funktioner. Hvad angår databasestyringssiden, tilbyder MongoDB følgende funktioner:
- Forespørgselssupport: Du kan bruge mange standardforespørgselstyper, såsom matchning (
==
), sammenligning (<
,> ), og regulære udtryk.
- Dataovernatning: Du kan gemme stort set enhver form for data, det være sig struktureret, delvist struktureret eller endda polymorfe.
- Skalerbarhed: Den håndterer flere forespørgsler blot ved at tilføje flere maskiner til serverklyngen.
- Fleksibilitet og smidighed: Du kan hurtigt udvikle applikationer med det.
- Dokumentorientering og skemaløshed: Du kan gemme alle oplysninger om en datamodel i et enkelt dokument.
- Justerbart skema: Du kan ændre skemaet for databasen med det samme, hvilket reducerer den tid, det tager at levere nye funktioner eller løse eksisterende problemer.
- Relationel databasefunktionalitet: Du kan udføre handlinger, der er fælles for relationelle databaser, såsom indeksering.
Hvad angår driftssiden, tilbyder MongoDB nogle få værktøjer og funktioner, som du ikke finder i andre databasesystemer:
- Skalerbarhed: Uanset om du har brug for en selvstændig server eller komplette klynger af uafhængige servere, kan du skalere MongoDB til den størrelse, du har brug for.
- Understøttelse af belastningsbalancering: MongoDB vil automatisk flytte data på tværs af forskellige shards.
- Automatisk failover-understøttelse: Hvis din primære server går ned, vil en ny primær server automatisk være oppe at køre.
- Administrationsværktøjer: Du kan spore dine maskiner ved hjælp af den cloud-baserede MongoDB Management Service (MMS).
- Hukommelseseffektivitet: Takket være de hukommelseskortede filer er MongoDB ofte mere effektiv end relationelle databaser.
Alle disse funktioner er ret nyttige. For eksempel, hvis du benytter dig af indekseringsfunktionen, vil meget af dine data blive opbevaret i hukommelsen til hurtig genfinding. Selv uden at indeksere specifikke dokumentnøgler, cacher MongoDB en hel del data ved hjælp af den mindst nyligt anvendte teknik.
Installation og kørsel af MongoDB
Nu hvor du er bekendt med MongoDB, er det tid til at få dine hænder snavsede og begynde at bruge det. Men først skal du installere det på din maskine. MongoDBs officielle websted indeholder to udgaver af databaseserveren:
- Fællesudgaven tilbyder den fleksible dokumentmodel sammen med ad hoc-forespørgsler, indeksering og aggregering i realtid for at give effektive måder at få adgang til og analysere dine data på. Denne udgave er frit tilgængelig.
- Enterprise-udgaven tilbyder de samme funktioner som fællesskabsudgaven plus andre avancerede funktioner relateret til sikkerhed og overvågning. Dette er den kommercielle udgave, men du kan bruge den gratis i ubegrænset tid til evaluering og udviklingsformål.
Hvis du er på Windows, kan du læse installationsvejledningen for at få komplette instruktioner. Generelt kan du gå til downloadsiden, vælge Windows-platformen i boksen Tilgængelige downloads, vælge .msi
installationsprogram, der passer til dit nuværende system, og klik på Download .
Kør installationsprogrammet, og følg instruktionerne på skærmen i installationsguiden. Denne side giver også information om, hvordan man kører MongoDB som en Windows-tjeneste.
Hvis du er på macOS, kan du bruge Homebrew til at installere MongoDB på dit system. Se installationsvejledningen for at få den komplette vejledning. Sørg også for at følge instruktionerne for at køre MongoDB som en macOS-tjeneste.
Hvis du er på Linux, vil installationsprocessen afhænge af din specifikke distribution. For en detaljeret guide til, hvordan du installerer MongoDB på forskellige Linux-systemer, skal du gå til installationsvejledningssiden og vælge den vejledning, der matcher dit nuværende operativsystem. Sørg for at køre MongoDB-dæmonen, mongod
, i slutningen af installationen.
Endelig kan du også installere MongoDB ved hjælp af Docker. Dette er praktisk, hvis du ikke ønsker at rode dit system med en anden installation. Hvis du foretrækker denne installationsmulighed, kan du læse den officielle vejledning og følge dens anvisninger. Bemærk, at forudgående viden om, hvordan du bruger Docker, vil være påkrævet i dette tilfælde.
Med MongoDB-databasen installeret og kørende på dit system, kan du begynde at arbejde med rigtige databaser ved hjælp af mongo
skal.
Oprettelse af MongoDB-databaser med mongo
Skal
Hvis du har fulgt installations- og kørselsinstruktionerne, burde du allerede have en forekomst af MongoDB kørende på dit system. Nu kan du begynde at oprette og teste dine egne databaser. I dette afsnit lærer du, hvordan du bruger mongo
shell til at oprette, læse, opdatere og slette dokumenter på en database.
Kører mongo
Skal
mongo
shell er en interaktiv JavaScript-grænseflade til MongoDB. Du kan bruge dette værktøj til at forespørge og manipulere dine data samt til at udføre administrative handlinger. Da det er en JavaScript-grænseflade, vil du ikke bruge det velkendte SQL-sprog til at forespørge databasen. I stedet skal du bruge JavaScript-kode.
For at starte mongo
skal du åbne din terminal eller kommandolinje og køre følgende kommando:
$ mongo
Denne kommando fører dig til mongo
skal. På dette tidspunkt vil du sandsynligvis se en masse meddelelser med oplysninger om shellens version og om serveradressen og porten. Til sidst vil du blive præsenteret for shell-prompten (>
) for at indtaste forespørgsler og kommandoer.
Du kan videregive databaseadressen som et argument til mongo
kommando. Du kan også bruge flere muligheder, såsom at angive værten og porten for at få adgang til en ekstern database, og så videre. For flere detaljer om, hvordan du bruger mongo
kommando, kan du køre mongo --help
.
Etablering af en forbindelse
Når du kører mongo
kommando uden argumenter, starter den shell og forbinder til standard lokale server leveret af mongod
proces på mongod://127.0.0.1:27017
. Det betyder, at du er forbundet til den lokale vært via port 27017
.
Som standard er mongo
shell starter sessionen ved at etablere en forbindelse til testen
database. Du kan få adgang til den aktuelle database gennem db
objekt:
> dbtest>
I dette tilfælde db
indeholder en reference til test
, som er standarddatabasen. For at skifte database, udfør kommandoen use
, giver et databasenavn som argument.
Sig for eksempel, at du vil oprette et websted for at udgive Python-indhold, og du planlægger at bruge MongoDB til at gemme dine tutorials og artikler. I så fald kan du skifte til webstedets database med følgende kommando:
> brug rptutorialsswitched til db rptutorials
Denne kommando skifter din forbindelse til rptutorials
database. MongoDB opretter ikke den fysiske databasefil på filsystemet, før du indsætter rigtige data i databasen. Så i dette tilfælde rptutorials
vises ikke på din nuværende databaseliste:
> vis dbsadmin 0.000GBconfig 0.000GBlocal 0.000GB>
mongo
shell giver en masse funktioner og muligheder. Det giver dig mulighed for at forespørge og manipulere dine data og også at administrere databaseserveren selv.
I stedet for at bruge et standardiseret forespørgselssprog såsom SQL, er mongo
shell bruger JavaScript-programmeringssproget og en brugervenlig API. Denne API giver dig mulighed for at lege med dine data, hvilket er emnet for næste afsnit.
Oprettelse af samlinger og dokumenter
En MongoDB-database er en fysisk beholder til samlinger af dokumenter. Hver database får sit eget sæt filer på filsystemet. Disse filer administreres af MongoDB-serveren, som kan håndtere flere databaser.
I MongoDB, en samling er en gruppe af dokumenter . Samlinger er lidt analoge med tabeller i et traditionelt RDBMS, men uden at pålægge et stift skema. I teorien kan hvert dokument i en samling have en helt anden struktur eller sæt af felter.
I praksis deler dokumenter i en samling almindeligvis en lignende struktur for at tillade ensartede genfindings-, indsættelses- og opdateringsprocesser. Du kan håndhæve en ensartet dokumentstruktur ved at bruge dokumentvalideringsregler under opdateringer og indsættelser.
At tillade forskellige dokumentstrukturer er en nøglefunktion i MongoDB-samlinger. Denne funktion giver fleksibilitet og gør det muligt at tilføje nye felter til dokumenter uden behov for at ændre et formelt tabelskema.
For at oprette en samling ved hjælp af mongo
shell, skal du pege db
til din måldatabase, og opret derefter samlingerne ved hjælp af punktnotationen :
> brug rptutorialsswitched til db rptutorials> dbrptutorials> db.tutorialrptutorials.tutorial
I dette eksempel bruger du priknotationen til at oprette tutorial
som en samling i rptutorials
, som er din nuværende database. Det er vigtigt at bemærke, at MongoDB opretter databaser og samlinger dovent . Med andre ord, de oprettes først fysisk, efter du har indsat det første dokument.
Når du har en database og en samling, kan du begynde at indsætte dokumenter. Dokumenter er lagerenheden i MongoDB. I et RDBMS ville dette svare til en tabelrække. Men MongoDBs dokumenter er langt mere alsidige end rækker, fordi de kan gemme kompleks information, såsom arrays, indlejrede dokumenter og endda arrays af dokumenter.
MongoDB gemmer dokumenter i et format kaldet Binær JSON (BSON), som er en binær repræsentation af JSON. MongoDBs dokumenter er sammensat af felt-og-værdi-par og har følgende struktur:
{ felt1 → værdi1, felt2 → værdi2, felt3 → værdi3, ... feltN → værdiN}
Værdien af et felt kan være en hvilken som helst BSON-datatype, inklusive andre dokumenter, arrays og arrays af dokumenter. I praksis vil du angive dine dokumenter ved hjælp af JSON-formatet.
Når du bygger en MongoDB-databaseapplikation, handler din vigtigste beslutning sandsynligvis om strukturen af dokumenter. Du skal med andre ord bestemme, hvilke felter og værdier dine dokumenter skal have.
I tilfælde af tutorials til dit Python-websted, kan dine dokumenter være struktureret således:
{ "title":"Læse og skrive CSV-filer i Python", "author":"Jon", "contributors":[ "Aldren", "Geir Arne", "Joanna", "Jason" ], "url":"https://realpython.com/python-csv/"}
Et dokument er i bund og grund et sæt af ejendomsnavne og deres værdier. Værdierne kan være simple datatyper, såsom strenge og tal, men de kan også være arrays såsom bidragsydere
i ovenstående eksempel.
MongoDBs dokumentorienterede datamodel repræsenterer naturligvis komplekse data som et enkelt objekt. Dette giver dig mulighed for at arbejde med dataobjekter holistisk, uden at du behøver at kigge på flere steder eller tabeller.
Hvis du brugte en traditionel RDBMS til at gemme dine tutorials, så ville du sandsynligvis have en tabel til at gemme dine tutorials og en anden tabel til at gemme dine bidragydere. Så er du nødt til at oprette en relation mellem begge tabeller, så du kan hente dataene senere.
Arbejde med samlinger og dokumenter
Indtil videre kender du det grundlæggende i, hvordan du kører og bruger mongo
skal. Du ved også, hvordan du opretter dine egne dokumenter ved hjælp af JSON-formatet. Nu er det tid til at lære, hvordan du indsætter dokumenter i din MongoDB-database.
At indsætte et dokument i en database ved hjælp af mongo
shell, skal du først vælge en samling og derefter kalde .insertOne()
på samlingen med dit dokument som argument:
> brug rptutorialsswitched til db rptutorials> db.tutorial.insertOne({... "title":"Læsning og skrivning af CSV-filer i Python",... "author":"Jon",.. . "bidragsydere":[... "Aldren",... "Geir Arne",... "Joanna",... "Jason"... ],... "url":"https:/ /realpython.com/python-csv/"... }){ "acnowledged" :true, "insertedId" :ObjectId("600747355e6ea8d224f754ba")}
Med den første kommando skifter du til den database, du vil bruge. Den anden kommando er et JavaScript-metodekald, der indsætter et simpelt dokument i den valgte samling, tutorial
. Når du trykker på Enter , får du en besked på din skærm, der informerer dig om det nyligt indsatte dokument og dets insertedId
.
Ligesom relationelle databaser har brug for en primær nøgle til entydigt at identificere hver række i en tabel, skal MongoDB-dokumenter have en _id
felt, der entydigt identificerer dokumentet. MongoDB giver dig mulighed for at indtaste en brugerdefineret _id
så længe du garanterer dens unikke karakter. En almindeligt accepteret praksis er dog at tillade MongoDB automatisk at indsætte en _id
for dig.
På samme måde kan du tilføje flere dokumenter på én gang ved at bruge .insertMany()
:
> tutorial1 ={... "title":"Sådan gentages en ordbog i Python",... "author":"Leodanis",... "bidragsydere":[... "Aldren",... "Jim",... "Joanna"... ],... "url":"https://realpython.com/iterate-through-dictionary-python/"... }> tutorial2 ={... "title":"Python 3's f-Strings:An Improved String Formatting Syntax",... "author":"Joanna",... "contributors":[... "Adriana ",... "David",... "Dan",... "Jim",... "Pavel"... ],... "url":"https://realpython.com/ python-f-strings/"... }> db.tutorial.insertMany([tutorial1, tutorial2]){ "acknowledged" :true, "insertedIds" :[ ObjectId("60074ff05e6ea8d224f754bb"), ObjectId4ff("5240b7ad 52467ef) }
Her kaldes .insertMany()
tager en liste over selvstudier og indsætter dem i databasen. Igen viser shell-output information om de nyligt indsatte dokumenter og deres automatisk tilføjede _id
felter.
mongo
shell giver også metoder til at udføre læse-, opdaterings- og slettehandlinger på databasen. For eksempel kan du bruge .find()
for at hente dokumenterne i en samling:
> db.tutorial.find(){ "_id" :ObjectId("600747355e6ea8d224f754ba"),"title" :"Læsning og skrivning af CSV-filer i Python","author" :"Jon","bidragsydere " :[ "Aldren", "Geir Arne", "Joanna", "Jason" ],"url" :"https://realpython.com/python-csv/" } ...> db.tutorial.find( {author:"Joanna"}){ "_id" :ObjectId("60074ff05e6ea8d224f754bc"),"title" :"Python 3's f-Strings:An Improved String Formatting Syntax (Guide)","author" :"Joanna"," bidragydere" :[ "Adriana", "David", "Dan", "Jim", "Pavel" ],"url" :"https://realpython.com/python-f-strings/" }
Det første kald til .find()
henter alle dokumenterne i tutorial
kollektion. På den anden side, det andet kald til .find()
henter de tutorials, der er skrevet af Joanna.
Med denne baggrundsviden om, hvordan man bruger MongoDB gennem sin mongo
shell, er du klar til at begynde at bruge MongoDB med Python. De næste par afsnit vil lede dig gennem forskellige muligheder for at bruge MongoDB-databaser i dine Python-applikationer.
Brug af MongoDB med Python og PyMongo
Nu hvor du ved, hvad MongoDB er, og hvordan du opretter og administrerer databaser ved hjælp af mongo
shell, kan du begynde at bruge MongoDB, men denne gang med Python. MongoDB leverer en officiel Python-driver kaldet PyMongo.
I dette afsnit gennemgår du nogle eksempler, der hjælper dig med at få en fornemmelse af, hvordan du bruger PyMongo til at oprette dine egne databaseapplikationer med MongoDB og Python.
Hvert modul i PyMongo er ansvarlig for et sæt operationer på databasen. Du har moduler til mindst følgende opgaver:
- Etablering af databaseforbindelser
- Arbejde med databaser
- Arbejde med samlinger og dokumenter
- Manipulation af markøren
- Arbejde med datakryptering
Generelt giver PyMongo et rigt sæt værktøjer, som du kan bruge til at kommunikere med en MongoDB-server. Det giver funktionalitet til at forespørge, hente resultater, skrive og slette data og køre databasekommandoer.
Installation af PyMongo
For at begynde at bruge PyMongo skal du først installere det i dit Python-miljø. Du kan bruge et virtuelt miljø, eller du kan bruge din systemdækkende Python-installation, selvom den første mulighed foretrækkes. PyMongo er tilgængelig på PyPI, så den hurtigste måde at installere det på er med pip
. Tænd din terminal og kør følgende kommando:
$ pip installation pymongo==3.11.2
Efter et par downloads og andre relaterede trin installerer denne kommando PyMongo på dit Python-miljø. Bemærk, at hvis du ikke angiver et specifikt versionsnummer, så pip
vil installere den seneste tilgængelige version.
Bemærk: For en komplet guide til, hvordan du installerer PyMongo, tjek siden Installation/Opgradering af dens officielle dokumentation.
Når du er færdig med installationen, kan du starte en interaktiv Python-session og køre følgende import:
>>>>>> importer pymongo
Hvis dette kører uden at rejse en undtagelse i Python-skallen, så fungerer din installation fint. Hvis ikke, så udfør omhyggeligt trinene igen.
Etablering af en forbindelse
For at etablere en forbindelse til en database, skal du oprette en MongoClient
eksempel. Denne klasse giver en klient til en MongoDB-instans eller server. Hvert klientobjekt har en indbygget forbindelsespulje, som som standard håndterer op til hundrede forbindelser til serveren.
Gå tilbage til din interaktive Python-session og importer MongoClient
fra pymongo
. Opret derefter et klientobjekt for at kommunikere med din MongoDB-instans, der kører i øjeblikket:
>>>>>> fra pymongo import MongoClient>>> client =MongoClient()>>> clientMongoClient(host=['localhost:27017'], ..., connect=True)
Koden ovenfor etablerer en forbindelse til standardværten (localhost
) og port (27017
). MongoClient
tager et sæt argumenter, der giver dig mulighed for at angive brugerdefinerede værts-, port- og andre forbindelsesparametre. For at angive en tilpasset vært og port kan du f.eks. bruge følgende kode:
>>>>>> klient =MongoClient(host="localhost", port=27017)
Dette er praktisk, når du skal angive en vært
og port
der adskiller sig fra MongoDBs standardopsætning. Du kan også bruge MongoDB URI-formatet:
>>>>>> klient =MongoClient("mongodb://localhost:27017")
Alle disse forekomster af MongoClient
give den samme klientopsætning for at forbinde din nuværende MongoDB-instans. Hvilken du skal bruge afhænger bare af, hvor eksplicit du vil være i din kode.
Når du har instantieret MongoClient
, kan du bruge dens instans til at henvise til den specifikke databaseforbindelse, ligesom du gjorde med mongo
shells db
objekt i ovenstående afsnit.
Arbejde med databaser, samlinger og dokumenter
Når du har en tilsluttet forekomst af MongoClient
, kan du få adgang til enhver database, der administreres af den angivne MongoDB-server. For at definere hvilken database du vil bruge, kan du bruge priknotationen ligesom du gjorde i mongo
skal:
>>>>>> db =client.rptutorials>>> dbDatabase(MongoClient(host=['localhost:27017'], ..., connect=True), 'rptutorials')
I dette tilfælde rptutorials
er navnet på den database, du vil arbejde med. Hvis databasen ikke eksisterer, så opretter MongoDB den for dig, men kun når du udfører den første handling på databasen.
Du kan også bruge ordbogstiladgang, hvis navnet på databasen ikke er et gyldigt Python-id:
>>>>>> db =klient["rptutorials"]
Denne erklæring er praktisk, når navnet på din database ikke er et gyldigt Python-id. For eksempel, hvis din database hedder rp-tutorials
, så skal du bruge ordbogslignende adgang.
Bemærk: Når du bruger mongo
shell, har du adgang til databasen gennem db
globalt objekt. Når du bruger PyMongo, kan du tildele databasen til en variabel kaldet db
at få lignende adfærd.
Lagring af data i din database ved hjælp af PyMongo svarer til, hvad du gjorde med mongo
skal i ovenstående afsnit. Men først skal du oprette dine dokumenter. I Python bruger du ordbøger til at oprette dokumenter:
>>>>>> tutorial1 ={... "title":"Arbejder med JSON-data i Python",... "author":"Lucas",... "bidragsydere":[ ... "Aldren",... "Dan",... "Joanna"... ],... "url":"https://realpython.com/python-json/"... }
Når du har oprettet dokumentet som en ordbog, skal du angive, hvilken samling du vil bruge. For at gøre det kan du bruge priknotationen på databaseobjektet:
>>>>>> tutorial =db.tutorial>>> tutorialCollection(Database(..., connect=True), 'rptutorials'), 'tutorial')
I dette tilfælde, tutorial
er en forekomst af Collection
og repræsenterer en fysisk samling af dokumenter i din database. Du kan indsætte dokumenter i tutorial
ved at kalde .insert_one()
på den med et dokument som argument:
>>>>>> resultat =tutorial.insert_one(tutorial1)>>> resultat>>> print(f"One tutorial:{result.inserted_id}" ) Ét selvstudie:60084b7d87eb0fbf73dbf71d
Her, .insert_one()
tager tutorial1
, indsætter det i tutorial
indsamling og returnerer en InsertOneResult
objekt. Dette objekt giver feedback på det indsatte dokument. Bemærk, at da MongoDB genererer ObjectId
dynamisk vil dit output ikke matche ObjectId
vist ovenfor.
Hvis du har mange dokumenter at tilføje til databasen, så kan du bruge .insert_many()
for at indsætte dem på én gang:
>>>>>> tutorial2 ={... "title":"Pythons anmodningsbibliotek (vejledning)",... "author":"Alex",... "bidragsydere":[ ... "Aldren",... "Brad",... "Joanna"... ],... "url":"https://realpython.com/python-requests/"... }>>> tutorial3 ={... "title":"Objektorienteret programmering (OOP) i Python 3",... "author":"David",... "bidragsydere":[... "Aldren ",... "Joanna",... "Jacob"... ],... "url":"https://realpython.com/python3-object-oriented-programming/"... }>>> new_result =tutorial.insert_many([tutorial2, tutorial3])>>> print(f"Flere tutorials:{new_result.inserted_ids}")Flere tutorials:[ ObjectId('6008511c87eb0fbf73dbf71e')f7bI81e'1f7d)61bI81e'07d)6f7bI71e'),f7071e'),f707e') /kode>
Dette er hurtigere og mere ligetil end at kalde .insert_one()
flere gange. Kaldet til .insert_many()
tager en gentagelse af dokumenter og indsætter dem i tutorial
samling i dine rptutorials
database. Metoden returnerer en forekomst af InsertManyResult
, som giver oplysninger om de indsatte dokumenter.
For at hente dokumenter fra en samling kan du bruge .find()
. Uden argumenter, .find()
returnerer en Markør
genstand, der leverer dokumenterne i samlingen efter anmodning:
>>>>>> importer pprint>>> til doc i tutorial.find():... pprint.pprint(doc)...{'_id':ObjectId('600747355e6ea8d224f754ba'), 'author':'Jon', 'contributors':['Aldren', 'Geir Arne', 'Joanna', 'Jason'], 'title':'Læsning og skrivning af CSV-filer i Python', 'url':' https://realpython.com/python-csv/'} ...{'_id':ObjectId('6008511c87eb0fbf73dbf71f'), 'author':'David', 'contributors':['Aldren', 'Joanna', 'Jacob'], 'title':'Object-Oriented Programming (OOP) in Python 3', 'url':'https://realpython.com/python3-object-oriented-programming/'}
Here, you run a loop on the object that .find()
returns and print successive results, using pprint.pprint()
to provide a user-friendly output format.
You can also use .find_one()
to retrieve a single document. In this case, you can use a dictionary that contains fields to match. For example, if you want to retrieve the first tutorial by Jon, then you can do something like this:
>>>>>> import pprint>>> jon_tutorial =tutorial.find_one({"author":"Jon"})>>> pprint.pprint(jon_tutorial){'_id':ObjectId('600747355e6ea8d224f754ba'), 'author':'Jon', 'contributors':['Aldren', 'Geir Arne', 'Joanna', 'Jason'], 'title':'Reading and Writing CSV Files in Python', 'url':'https://realpython.com/python-csv/'}
Note that the tutorial’s ObjectId
is set under the _id
key, which is the unique document identifier that MongoDB automatically adds when you insert a document into your database.
PyMongo also provides methods to replace, update, and delete documents from a database. If you want to dive deeper into these features, then take a look at the documentation for Collection
.
Closing Connections
Establishing a connection to a MongoDB database is typically an expensive operation. If you have an application that constantly retrieves and manipulates data in a MongoDB database, then you probably don’t want to be opening and closing the connection all the time since this might affect your application’s performance.
In this kind of situation, you should keep your connection alive and only close it before exiting the application to clear all the acquired resources. You can close the connection by calling .close()
on the MongoClient
instance:
>>>>>> client.close()
Another situation is when you have an application that occasionally uses a MongoDB database. In this case, you might want to open the connection when needed and close it immediately after use for freeing the acquired resources. A consistent approach to this problem would be to use the with
udmelding. Yes, MongoClient
implements the context manager protocol:
>>>>>> import pprint>>> from pymongo import MongoClient>>> with MongoClient() as client:... db =client.rptutorials... for doc in db.tutorial.find():... pprint.pprint(doc)...{'_id':ObjectId('600747355e6ea8d224f754ba'), 'author':'Jon', 'contributors':['Aldren', 'Geir Arne', 'Joanna', 'Jason'], 'title':'Reading and Writing CSV Files in Python', 'url':'https://realpython.com/python-csv/'} ...{'_id':ObjectId('6008511c87eb0fbf73dbf71f'), 'author':'David', 'contributors':['Aldren', 'Joanna', 'Jacob'], 'title':'Object-Oriented Programming (OOP) in Python 3', 'url':'https://realpython.com/python3-object-oriented-programming/'}
If you use the with
statement to handle your MongoDB client, then at the end of the with
code block, the client’s .__exit__()
method gets called, which at the same time closes the connection by calling .close()
.
Using MongoDB With Python and MongoEngine
While PyMongo is a great and powerful Python driver for interfacing with MongoDB, it’s probably a bit too low-level for many of your projects. With PyMongo, you’ll have to write a lot of code to consistently insert, retrieve, update, and delete documents.
One library that provides a higher abstraction on top of PyMongo is MongoEngine. MongoEngine is an object-document mapper (ODM), which is roughly equivalent to an SQL-based object-relational mapper (ORM). MongoEngine provides a class-based abstraction, so all the models you create are classes.
Installing MongoEngine
There are a handful of Python libraries to help you work with MongoDB. MongoEngine, however, is a popular one that provides a nice set of features, flexibility, and community support. MongoEngine is available on PyPI. You can install it using the following pip
kommando:
$ pip install mongoengine==0.22.1
Once you’ve installed MongoEngine into your Python environment, you’re ready to start working with MongoDB databases using Python’s object-oriented features. The next step is to connect to your running MongoDB instance.
Establishing a Connection
To establish a connection with your database, you need to use mongoengine.connect()
. This function takes several arguments. However, in this tutorial, you’ll use only three of them. Within your Python interactive session, type the following code:
>>>>>> from mongoengine import connect>>> connect(db="rptutorials", host="localhost", port=27017)MongoClient(host=['localhost:27017'], ..., read_preference=Primary())
Here, you first set the database name db
to "rptutorials"
, which is the name of the database you want to work in. Then you provide a host
and a port
to connect to your current MongoDB instance. Since you’re using the default host
and port
, you can omit these two parameters and just use connect("rptutorials")
.
Working With Collections and Documents
To create documents with MongoEngine, you first need to define what data you want the documents to have. In other words, you need to define a document schema. MongoEngine encourages you to define a document schema to help you reduce coding errors and to allow you to define utility or helper methods.
Similar to ORMs, ODMs like MongoEngine provide a base or model class for you to define a document schema. In ORMs, that class is equivalent to a table, and its instances are equivalent to rows. In MongoEngine, the class is equivalent to a collection, and its instances are equivalent to documents.
To create a model, you need to subclass Document
and provide the required fields as class attributes. To continue with the blog example, here’s how you can create a model for your tutorials:
>>>>>> from mongoengine import Document, ListField, StringField, URLField>>> class Tutorial(Document):... title =StringField(required=True, max_length=70)... author =StringField(required=True, max_length=20)... contributors =ListField(StringField(max_length=20))... url =URLField(required=True)
With this model, you tell MongoEngine that you expect a Tutorial
document to have a .title
, an .author
, a list of .contributors
, and a .url
. The base class, Document
, uses that information along with the field types to validate the input data for you.
Bemærk: One of the more difficult tasks with database models is data validation . How do you make sure that the input data conforms to your format requirements? That’s one of the reasons for you to have a coherent and uniform document schema.
MongoDB is said to be a schemaless database, but that doesn’t mean it’s schema free. Having documents with a different schema within the same collection can lead to processing errors and inconsistent behavior.
For example, if you try to save a Tutorial
object without a .title
, then your model throws an exception and lets you know. You can take this even further and add more restrictions, such as the length of the .title
, and so on.
There are a few general parameters that you can use to validate fields. Here are some of the more commonly used parameters:
db_field
specifies a different field name.
required
ensures that the field is provided.
default
provides a default value for a given field if no value is given.
unique
ensures that no other document in the collection has the same value for this field.
Each specific field type also has its own set of parameters. You can check the documentation for a complete guide to the available field types.
To save a document to your database, you need to call .save()
on a document object. If the document already exists, then all the changes will be applied to the existing document. If the document doesn’t exist, then it’ll be created.
Here’s an example of creating and saving a tutorial into your sample tutorials database:
>>>>>> tutorial1 =Tutorial(... title="Beautiful Soup:Build a Web Scraper With Python",... author="Martin",... contributors=["Aldren", "Geir Arne", "Jaya", "Joanna", "Mike"],... url="https://realpython.com/beautiful-soup-web-scraper-python/"... )>>> tutorial1.save() # Insert the new tutorial
By default, .save()
inserts the new document into a collection named after the model class, Tutorial
, except using lowercase letters. In this case, the collection name is tutorial
, which matches the collection you’ve been using to save your tutorials.
PyMongo performs data validation when you call .save()
. This means that it checks the input data against the schema you declared in the Tutorial
model class. If the input data violates the schema or any of its constraints, then you get an exception, and the data isn’t saved into the database.
For example, here’s what happens if you try to save a tutorial without providing a .title
:
>>>>>> tutorial2 =Tutorial()>>> tutorial2.author ="Alex">>> tutorial2.contributors =["Aldren", "Jon", "Joanna"]>>> tutorial2.url ="https://realpython.com/convert-python-string-to-int/">>> tutorial2.save()Traceback (most recent call last):...mongoengine.errors.ValidationError:... (Field is required:['title'])
In this example, first note that you can also build a Tutorial
object by assigning values to its attributes. Second, since you don’t provide a .title
for the new tutorial, .save()
raises a ValidationError
telling you that the .title
field is required. Having automatic data validation is a great feature that will save you some headaches.
Each Document
subclass has an .objects
attribute that you can use to access the documents in the associated collection. For example, here’s how you can print the .title
of all your current tutorials:
>>>>>> for doc in Tutorial.objects:... print(doc.title)...Reading and Writing CSV Files in PythonHow to Iterate Through a Dictionary in PythonPython 3's f-Strings:An Improved String Formatting Syntax (Guide)Working With JSON Data in PythonPython's Requests Library (Guide)Object-Oriented Programming (OOP) in Python 3Beautiful Soup:Build a Web Scraper With Python
The for
loop iterates over all your tutorials and prints their .title
data to the screen. You can also use .objects
to filter your documents. For example, say you want to retrieve the tutorials authored by Alex. In that case, you can do something like this:
>>>>>> for doc in Tutorial.objects(author="Alex"):... print(doc.title)...Python's Requests Library (Guide)
MongoEngine is well suited to manage your MongoDB databases for just about any type of application. Its features make it ideal for creating efficient and scalable programs using a high-level approach. If you’re looking for more information about MongoEngine, be sure to check out its user guide.
Conclusion
If you need a robust, scalable, and flexible database solution, then MongoDB might be a good option for you. MongoDB is a mature and popular NoSQL database with great Python support. With a good understanding of how to access MongoDB with Python, you’ll be ready to create database applications that scale well and provide excellent performance.
With MongoDB, you also have the benefit of a human-readable and highly-flexible data model, so you can adapt to requirement changes quickly.
In this tutorial, you learned:
- What MongoDB and NoSQL databases are
- How to install and run MongoDB on your system
- How to create and work with MongoDB databases
- How to interface with MongoDB in Python using the PyMongo driver
- How to use the MongoEngine object-document mapper to work with MongoDB
The examples you coded in this tutorial are available for download. To get their source code, click the link below:
Hent kildekoden: Click here to get the source code you’ll use to learn about using MongoDB with Python in this tutorial.