Sedan flera år tillbaka har MongoDB varit den goda NoSQL-databasen för både individer och företag som bygger storskaliga applikationer. Den är öppen källkod, lätt skalbar och ger hög tillgänglighet. Den stöder också mycket komplexa frågor och finkornig samtidighetskontroll.
Nödvändiga uppgifter som att installera databasen, ställa in den för att bibehålla optimal prestanda under långa tidsperioder och säkra den tenderar dock att kräva mycket skicklig och dedikerad ansträngning.
Lyckligtvis finns det ett enklare alternativ: MongoDB Atlas, en helt hanterad molnversion av databasen.
Med MongoDB Atlas kan du skapa ett MongoDB-kluster på valfri större molnleverantör och börja använda det klustret inom några minuter. Med Atlas webbläsarbaserade användargränssnitt kan du också intuitivt konfigurera klustret och övervaka dess prestanda.
I den här handledningen visar jag dig hur du skapar ett MongoDB Atlas gratis nivåkluster och använder det i en Python-applikation.
Förutsättningar
Innan du fortsätter, se till att du har följande installerat och konfigurerat på din dator:
- Python 3.4 eller senare
- pip 18.0 eller högre
1. Skapa ett kluster
För att kunna använda MongoDBs molntjänster behöver du ett MongoDB Atlas-konto. För att skapa en, gå till dess startsida och tryck på Kom igång gratis knappen.
När du har fyllt i det korta registreringsformuläret omdirigeras du till guiden för att skapa kluster. I det första avsnittet måste du välja den molnleverantör och region du föredrar.
För att minimera nätverkslatensen skulle du helst välja en region som ligger närmast din dator. För nu, men eftersom vi skapar ett gratis tier-kluster, se till att regionen du väljer är en som har en gratis tier tillgänglig. Om du dessutom använder en Google Cloud VM eller en Amazon EC2-instans som din utvecklingsmiljö, välj först motsvarande molnleverantör.
I Klusternivån väljer du M0 alternativ för att skapa ditt kostnadsfria nivåkluster. Den erbjuder 512 MB lagringsutrymme, en ny version av MongoDB med WiredTiger som lagringsmotor, en replikuppsättning av tre noder och generösa 10 GB bandbredd per vecka.
Till sist, ge ett meningsfullt namn till klustret och tryck på Skapa kluster knappen.
MongoDB Atlas kommer nu att ta cirka fem minuter att konfigurera ditt kluster.
2. Konfigurera klustret
Innan du börjar använda klustret måste du ange några säkerhetsrelaterade detaljer, så byt till Säkerhet flik.
Först i MongoDB-användare måste du skapa en ny användare för dig själv genom att trycka på Lägg till ny användare knapp. I dialogrutan som dyker upp, skriv in ditt önskade användarnamn och lösenord, välj Läs och skriv till valfri databas privilegium och tryck på Lägg till användare knappen.
Därefter i IP-vitlista måste du ange en lista över IP-adresser från vilka du kommer att få åtkomst till klustret. För närvarande räcker det att ange den aktuella IP-adressen för din dator.
Tryck på Lägg till IP-adress för att skapa en ny IP-adresspost. I dialogrutan som dyker upp trycker du på Lägg till aktuell IP-adress knappen för att autofylla vitlistaposten fält. Dessutom, om du inte har en statisk IP-adress, är det en bra idé att markera att det är en tillfällig post genom att markera Spara som tillfällig vitlista alternativ. Tryck slutligen på Bekräfta för att lägga till posten.
3. Hämta anslutningssträngen
Du behöver en giltig anslutningssträng för att ansluta till ditt kluster från din applikation. För att få det, gå till Översikt fliken och tryck på Anslut knappen.
I dialogrutan som öppnas väljer du Anslut din applikation och tryck på Jag använder drivrutin 3.6 eller senare knapp. Du bör nu kunna se din anslutningssträng. Det kommer inte att ha ditt faktiska lösenord, så du måste ange det manuellt. När du har gjort det, anteckna strängen så att du kan använda den senare.
4. Installera Python-drivrutinen
För att kunna interagera med ditt MongoDB Atlas-kluster programmatiskt måste du ha en MongoDB-drivrutin installerad på din dator. För programmeringsspråket Python är PyMongo den mest populära drivrutinen som finns tillgänglig idag. Det rekommenderade sättet att installera det på din dator är att använda pip
modul som visas nedan:
python3 -m pip install pymongo --user
Du kanske har märkt att din MongoDB Atlas-anslutningssträng är en mongodb+srv://
URI. För att drivrutinen ska fungera med DNS SRV-poster måste du också installera dnspython
modul. Så här gör du:
python3 -m pip install dnspython --user
5. Ansluter till klustret
Du kan nu använda ditt MongoDB-kluster från vilken Python-applikation som helst. För att följa med mig, skapa ett nytt Python-skript och öppna det med valfri kodredigerare.
Inuti skriptet, för att kunna interagera med klustret, behöver du en instans av MongoClient
klass. Som det enda argumentet till dess konstruktor, skicka din anslutningssträng.
import pymongo my_client = pymongo.MongoClient( 'mongodb+srv://alice:[email protected]/test?retryWrites=true' )
Ovanstående konstruktör återkommer omedelbart och kommer inte att ta upp några fel. Därför, för att kontrollera om du har lyckats upprätta en anslutning, föreslår jag att du försöker utföra en operation på klustret. Ett anrop till server_info()
metod, som ger dig olika detaljer om din MongoDB-instans, kommer att räcka.
Om det inte finns några fel i din anslutningssträng, anropet till server_info()
metod kommer att lyckas. Men om användarnamnet eller lösenordet du angav är felaktigt kommer du att stöta på ett OperationFailure
fel. Följande kod visar hur du fångar det:
try: print("MongoDB version is %s" % my_client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1)
Du kan nu gå vidare och prova att köra ditt skript.
6. Infoga dokument
Standardanslutningssträngen du får från MongoDB Atlas webbgränssnitt nämner en databas med namnet test
. Låt oss fortsätta att använda samma databas. Så här kan du få en referens till den:
my_database = my_client.test
En MongoDB-databas är sammansatt av en eller flera samlingar, som bara är grupper av BSON-dokument (förkortning för binär JSON). Ditt gratisnivåkluster på MongoDB Atlas kan ha maximalt 500 samlingar.
För att få ett realistiskt exempel, låt oss skapa en ny samling som heter foods
. Med PyMongo behöver du inte uttryckligen anropa någon metod för att göra det. Du kan helt enkelt referera till det som om det redan finns.
my_collection = my_database.foods
Det är värt att nämna att koden ovan inte skapar foods
insamling omedelbart. Det skapas först efter att du har lagt till ett dokument till det. Så låt oss nu skapa och lägga till ett nytt dokument som innehåller näringsdata om ett livsmedel.
Använda insert_one()
metoden är det enklaste sättet att lägga till ett dokument i en samling. För att specificera innehållet i dokumentet skickar du en Python-ordbok till metoden. Följande exempelkod visar dig hur:
my_collection.insert_one({ "_id": 1, "name": "pizza", "calories": 266, "fats": { "saturated": 4.5, "trans": 0.2 }, "protein": 11 })
Att lägga till dokument ett i taget kan vara ineffektivt. Med insert_many()
metod kan du lägga till flera dokument till din samling samtidigt. Den förväntar sig en rad ordböcker som input. Följande kod lägger till ytterligare två dokument till samlingen:
my_collection.insert_many([ { "_id": 2, "name": "hamburger", "calories": 295, "protein": 17, "fats": { "saturated": 5.0, "trans": 0.8 }, }, { "_id": 3, "name": "taco", "calories": 226, "protein": 9, "fats": { "saturated": 4.4, "trans": 0.5 }, } ])
_id
fältet som du ser i ovanstående dokument är ett fält som används som primärnyckel av MongoDB. Som sådan är den oföränderlig och måste finnas i alla MongoDB-dokument. Om du glömmer att inkludera det när du skapar ditt dokument kommer PyMongo att lägga till det automatiskt och tilldela det ett automatiskt genererat unikt värde.
7. Kör frågor
När du har lagt till några dokument till din samling kan du köra frågor på den genom att anropa find()
metod, som returnerar en Cursor
objekt du kan iterera över. Om du inte skickar några argument till den, find
returnerar alla dokument i samlingen.
Följande kod visar hur du skriver ut namnen på alla livsmedel som finns i vår kollektion:
my_cursor = my_collection.find() for item in my_cursor: print(item["name"]) # Output is: # pizza # hamburger # taco
Om du vill ha find()
metod för att endast returnera de dokument som matchar specifika kriterier måste du skicka en Python-ordbok till den. Till exempel, om du vill hitta dokumentet vars name
fältet är satt till "pizza", kan du använda följande kod:
my_cursor = my_collection.find({ "name": "pizza" })
För mer komplexa frågor kan du använda MongoDB:s intuitivt namngivna frågeoperatorer i de ordböcker du skickar till find()
metod. Till exempel visar följande kod hur du använder $lt
operatör för att hitta dokument vars calories
fältet är inställt på ett värde som är mindre än 280:
my_cursor = my_collection.find({ "calories": { "$lt": 280 } }) for item in my_cursor: print("Name: %s, Calories: %d" % (item["name"], item["calories"])) # Output is: # Name: pizza, Calories: 266 # Name: taco, Calories: 226
Genom att använda punktnotationen kan du också använda kapslade fält i dina frågor. Följande kod visar hur du hittar dokument vars trans
fältet, som finns inuti fats
fält, sätts till ett värde som är större än eller lika med 0,5:
my_cursor = my_collection.find({ "fats.trans": { "$gte": 0.5 } }) for item in my_cursor: print("Name: %s, Trans fats: %.2f" % (item["name"], item["fats"]["trans"])) # Output is: # Name: hamburger, Trans fats: 0.80 # Name: taco, Trans fats: 0.50
8. Uppdatera och ta bort dokument
Mycket lik insert_one()
och insert_many()
metoder är update_one()
och update_many()
metoder, som du kan använda för att ändra innehållet i dokument som redan finns i din samling. Båda uppdateringsmetoderna, förutom ny data, behöver en fråga för att nollställa de dokument som behöver ändras.
Du kan använda en mängd olika uppdateringsoperatorer i dina uppdateringsmetoder. Den vanligaste är $set
, som låter dig lägga till nya fält eller uppdatera värdena för befintliga fält. Följande kod visar hur du lägger till två nya fält med namnet fiber
och sugar
till dokumentet vars name
fältet är satt till "taco":
my_collection.update_one( { "name": "taco" }, # query { "$set": { # new data "fiber": 3.95, "sugar": 0.9 } } )
Om frågan skickas till update_one()
metod returnerar mer än ett dokument, endast det första dokumentet uppdateras. update_many()
metoden har inte denna begränsning.
Slutligen, genom att använda delete_one()
och delete_many()
metoder kan du ta bort dokument i dina samlingar. Båda metoderna behöver en fråga för att avgöra vilka dokument som måste raderas. Så här kan du radera alla dokument vars calories
fältet är inställt på ett värde som är mindre än 300:
my_collection.delete_many({ "calories": { "$lt": 300 } }) # Deletes all the three documents