Seperti yang disebutkan di bagian pertama dari seri ini:Pemrograman Database Python dengan MongoDB, modul Python PyMongo diperlukan agar Python dapat berkomunikasi dengan database MongoDB. Untuk menginstal ini, gunakan perintah di Prompt Perintah Windows:
pip3 install pymongo
Menginstal PyMongo akan menghasilkan output yang mirip dengan yang ditunjukkan di bawah ini:
Gambar 1 – Memasang Modul PyMongo
Bergantung pada konfigurasi Python, modul tambahan bernama dnspython mungkin juga diperlukan:
pip3 install dnspython
Gambar 2 – Memasang dnspython modul
Cara Memasukkan Data ke MongoDB dengan Python
Kode di bawah ini akan membuat 15 Artis . yang dihasilkan secara acak dan dua Album untuk masing-masing:
# bad-band-name-maker-nosql.py import sys import random import pymongo part1 = ["The", "Uncooked", "Appealing", "Larger than Life", "Drooping", "Unwell", "Atrocious", "Glossy", "Barrage", "Unlawful"] part2 = ["Defeated", "Hi-Fi", "Extraterrestrial", "Adumbration", "Limpid", "Looptid", "Cromulent", "Unsettled", "Soot", "Twinkle"] part3 = ["Brain", "Segment", "\"Audio\"", "Legitimate Business", "\"Bob\"", "Sound", "Canticle", "Monsoon", "Preserves", "\"Cacophony\""] part4 = ["Cougar", "Lion", "Lynx", "Ocelot", "Puma", "Jaguar", "Panther"] part5 = ["Fodder", "Ersatz Goods", "Leftovers", "Infant Formula", "Mush", "Smoothie", "Milkshakes"] def main(argv): # Connect to the RazorDemo database. client = pymongo.MongoClient("mongodb+srv://yourUser:[email protected]/RazorDemo?retryWrites=true&w=majority", serverSelectionTimeoutMS=5000) artistsCollection = client["RazorDemo"]["Artists"] albumsCollection = client["RazorDemo"]["Albums"] # Generate 15 bad band names, and try to keep them unique. previousNames = "" nameCount = 0 artistJson = [] while (nameCount < 16): rand1 = random.randrange(0, 9) rand2 = random.randrange(0, 9) rand3 = random.randrange(0, 9) badName = part1[rand1] + ' ' + part2[rand2] + ' ' + part3[rand3] # Unlike with SQL-oriented databases, MongoDB allows for the insertion of multiple documents in a single statement. # In this case, the code will build a JSON list of all the band names to be inserted in a one fell swoop. if ("|" + previousNames + "|").find("|" + badName + "|") == -1: #print ("Band name [" + str(nameCount) + "] is [" + badName + "]") # Don't forget to escape quotation marks! jsonEntry = { "artist_name" : badName } artistJson.append(jsonEntry) # Because there are no foreign key rules, the album names can be created # and committed to the database before the artist names have been created. albumJson = [] for y in range(1, 3): rand4 = random.randrange(0, len(part4)) rand5 = random.randrange(0, len(part5)) # No checks for uniqueness here. Peter Gabriel had 4 self-titled # albums after all. albumName = part4[rand4] + " " + part5[rand5] albumEntry = { "artist_name" : badName, "album_name" : albumName } albumJson.append(albumEntry) print (albumJson) albumsCollection.insert_many(albumJson) # Creates a bar-delimited list of previously used names. # MongoDB expects the application to enforce data integrity rules. if previousNames == "": previousNames = badName else: previousNames = previousNames + "|" + badName nameCount = 1 + nameCount else: print ("Found a duplicate of [" + badName + "]") print (artistJson) artistsCollection.insert_many(artistJson) # Close the Connection client.close() return 0 if __name__ == "__main__": main(sys.argv[1:]) Listing 6 - Creating Random Data
Satu pengamatan menarik tentang kode ini, setidaknya dibandingkan dengan contoh berorientasi SQL dalam Pemrograman Basis Data Python dengan SQL Express untuk Pemula adalah jauh lebih sederhana, karena tidak ada komponen SQL tambahan. Fungsi JSON sudah menjadi bagian dari Python dan satu-satunya perintah yang terkait dengan MongoDB adalah insert_many() fungsi yang dijalankan setelah setiap kumpulan data dibuat. Lebih nyaman lagi, perintah ini cocok dengan sintaks yang sama dalam Python yang digunakan di MongoDB Shell.
Dari sudut pandang keamanan, masalah seperti SQL Injection sama sekali tidak ada dalam kode tersebut, bukan hanya karena tidak ada SQL yang dieksekusi, tetapi sama sekali tidak ada kode apa pun yang diteruskan ke database. Fungsionalitas Daftar Python juga menangani masalah seperti menghilangkan tanda kutip.
Alih-alih menampilkan output di jendela Command Prompt, kode lain akan digunakan untuk menanyakan database.
Memvalidasi Sisipan dengan Python
Kode di bawah ini akan menanyakan database MongoDB untuk tindakan penyisipan yang dibuat di atas menggunakan Python:
# bad-band-name-display-nosql.py import sys import pymongo def main(argv): # Connect to the RazorDemo database. client = pymongo.MongoClient("mongodb+srv://yourUser:[email protected]/RazorDemo?retryWrites=true&w=majority", serverSelectionTimeoutMS=5000) artistsCollection = client["RazorDemo"]["Artists"] albumsCollection = client["RazorDemo"]["Albums"] print ("Albums:") artists = artistsCollection.find() for artist in artists: print (str(artist["artist_name"])) albumQuery = { "artist_name": {"$eq" : str(artist["artist_name"])} } albumsForThisArtist = albumsCollection.find(albumQuery) for album in albumsForThisArtist: print ("\t" + str(album["album_name"])) # Close the Connection client.close() return 0 if __name__ == "__main__": main(sys.argv[1:]) Listing 7 - Validating the Insert Actions
Output di bawah ini berisi dokumen awal yang dibuat lebih lanjut dalam dokumen:
Gambar 3 – Memvalidasi Sisipan
Meminta Data MongoDB dengan Python
Kode di atas dapat diadaptasi menjadi alat interaktif untuk mengkueri data dengan input pengguna. MongoDB menyediakan alat pencarian teks yang kuat untuk koleksinya, tetapi untuk mengaktifkannya, indeks teks harus dibuat pada koleksi yang akan dicari:
db.Artists.createIndex({artist_name: "text"}) db.Albums.createIndex({artist_name: "text", album_name: "text"}) Listing 8 - Creating Text Indices for each collection
Perhatikan bahwa MongoDB hanya mengizinkan satu indeks teks per koleksi. Mencoba membuat indeks lain untuk node yang berbeda dalam koleksi akan menyebabkan kesalahan. Output dari perintah-perintah ini di MongoDB Shell di bawah ini:
Gambar 4 – Menambahkan Indeks Teks
Sementara alat pencarian teks dapat melakukan semua jenis logika pencocokan gila yang melibatkan ekspresi reguler dan kecocokan parsial dengan peringkat kedekatan, contoh di bawah ini akan menggunakan pencocokan sederhana, untuk mengilustrasikan bukti konsep:
# bad-band-name-query-nosql.py import sys import pymongo def main(argv): searchValue = input("Enter something: ") # Cap the length at something reasonable. The first 20 characters. searchValue = searchValue[0:20] # Set the search value to lower case so we can perform case-insensitive matching: searchValue = searchValue.lower() # Connect to the RazorDemo database. client = pymongo.MongoClient("mongodb+srv://yourUser:[email protected]/RazorDemo?retryWrites=true&w=majority", serverSelectionTimeoutMS=5000) artistsCollection = client["RazorDemo"]["Artists"] albumsCollection = client["RazorDemo"]["Albums"] matchedArtists = ""; artists = artistsCollection.find( { "$text":{ "$search": searchValue} }) for artist in artists: matchedArtists = matchedArtists + "\t" + str(artist["artist_name"]) + "\r\n" if "" == matchedArtists: print ("No matched artists.") else: print ("Matched Artists:") print (matchedArtists) albums = albumsCollection.find( { "$text":{ "$search": searchValue} }) matchedAlbums = "" for album in albums: matchedAlbums = matchedAlbums + "\t" + str(album["artist_name"]) + " - " + str(album["album_name"]) + "\r\n" if "" == matchedAlbums: print ("No matched albums.") else: print ("Matched Albums:") print (matchedAlbums) # Close the Connection client.close() return 0 if __name__ == "__main__": main(sys.argv[1:]) Listing 9 - Querying the data
Perhatikan bahwa tidak diperlukan konversi data yang keluar dari MongoDB untuk mencocokkannya dengan versi huruf kecil dari istilah penelusuran.
Pemikiran Akhir tentang Pengembangan Python dan MongoDB
Untuk pengembang yang telah melakukan pengkodean terhadap server dan basis data berorientasi SQL, lompatan ke noSQL dapat terasa seperti menskalakan kurva pembelajaran yang sangat curam, tetapi dengan memetakan konsep basis data SQL yang sudah dikenal ke rekan-rekan NoSQL mereka, menjadi sedikit kurang nyaman dari pendakian . Pengembang tersebut bahkan mungkin terkejut dengan kurangnya "fitur" "dasar" seperti penegakan kunci asing atau harapan bahwa itu adalah aplikasi dan bukan database yang diharapkan untuk menegakkan aturan integritas data. Untuk pengembang database berorientasi SQL yang sangat berpengalaman, bahkan hanya memikirkan ide-ide seperti itu hampir terasa seperti bidat pemrograman!
Tetapi basis data NoSQL seperti MongoDB menambahkan banyak fitur lain yang membuat perubahan pemikiran menjadi sepadan. Tidak perlu khawatir tentang versi lain dari SQL yang "cukup berbeda" untuk mengganggu, atau tidak harus memikirkan masalah seperti injeksi SQL, dapat memasukkan banyak catatan, err, dokumen data dengan aman tanpa kerumitan " ribuan” pernyataan individu, dan bahkan mungkin menghibur gagasan "gila" bahwa meminta aplikasi melakukan penegakan data memangkas sebagian besar upaya pengembangan aplikasi membuat semuanya layak untuk dipertimbangkan.