MongoDB with Python¶
MongoDB menyimpan data dalam dokumen mirip JSON, yang membuat basis data ini sangat fleksibel dan skalabel.
Untuk dapat bereksperimen dengan contoh kode dalam tutorial ini, Anda memerlukan akses ke basis data MongoDB.
Anda dapat mengunduh basis data MongoDB gratis di https://www.mongodb.com.
Atau, segera mulai dengan layanan cloud MongoDB di https://www.mongodb.com/cloud/atlas.
PyMongo¶
Python membutuhkan driver MongoDB untuk mengakses database MongoDB.
Dalam tutorial ini, kita akan menggunakan driver MongoDB "PyMongo".
Kami menyarankan Anda menggunakan PIP untuk menginstal "PyMongo".
PIP kemungkinan besar sudah terpasang di lingkungan Python Anda.
Arahkan baris perintah Anda ke lokasi PIP, dan ketik perintah berikut:
#Download and install "PyMongo":
C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>python -m pip install pymongo
Sekarang Anda telah mengunduh dan menginstal driver mongoDB.
Test PyMongo¶
Untuk menguji apakah instalasi berhasil, atau jika Anda sudah menginstal "pymongo", buat halaman Python dengan konten berikut:
#demo_mongodb_test.py:
import pymongo
Jika kode di atas dijalankan tanpa kesalahan, "pymongo" terinstal dan siap digunakan.
Creating a Database¶
Untuk membuat database di MongoDB, mulailah dengan membuat objek MongoClient, lalu tentukan URL koneksi dengan alamat IP yang benar dan nama database yang ingin Anda buat.
MongoDB akan membuat database jika belum ada, dan membuat koneksi ke sana.
#Create a database called "mydatabase":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
MongoDB menunggu hingga Anda membuat koleksi (tabel), dengan setidaknya satu dokumen (catatan) sebelum benar-benar membuat database (dan koleksi).
Check if Database Exists¶
Catatan
Dalam MongoDB, suatu basis data tidak dibuat hingga memperoleh konten, jadi jika ini pertama kalinya Anda membuat basis data, Anda harus menyelesaikan dua bab berikutnya (membuat koleksi dan membuat dokumen) sebelum Anda memeriksa apakah basis data tersebut ada!
Anda dapat memeriksa apakah suatu basis data ada dengan mencantumkan semua basis data di sistem Anda:
#Return a list of your system's databases:
print(myclient.list_database_names())
#result: ['admin', 'local', 'mydatabase']
Atau Anda dapat memeriksa database tertentu berdasarkan nama:
dblist = myclient.list_database_names()
if "mydatabase" in dblist:
print("The database exists.")
#result: The database exists.
Creating a Collection¶
Catatan
Collection dalam MongoDB sama dengan tabel dalam basis data SQL.
Untuk membuat koleksi di MongoDB, gunakan objek basis data dan tentukan nama koleksi yang ingin Anda buat.
MongoDB akan membuat koleksi jika belum ada.
#Create a collection called "customers":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
Penting
Dalam MongoDB, suatu koleksi tidak dibuat hingga mendapat konten!
MongoDB menunggu hingga Anda memasukkan dokumen sebelum benar-benar membuat koleksi.
Check if Collection Exists¶
#Return a list of all collections in your database:
print(mydb.list_collection_names())
#result: ['customers']
#Check if the "customers" collection exists:
collist = mydb.list_collection_names()
if "customers" in collist:
print("The collection exists.")
Insert Into Collection¶
Catatan
A document in MongoDB is the same as a record in SQL databases.
Untuk menyisipkan rekaman, atau dokumen sebagaimana disebut dalam MongoDB, ke dalam koleksi, kita menggunakan metode insert_one().
Parameter pertama metode insert_one() adalah dictionary yang berisi nama dan nilai setiap kolom dalam dokumen yang ingin Anda sisipkan.
#Insert a record in the "customers" collection:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mydict = { "name": "John", "address": "Highway 37" }
x = mycol.insert_one(mydict)
Return the _id Field¶
Metode insert_one() mengembalikan objek InsertOneResult, yang memiliki properti, insert_id, yang menyimpan id dokumen yang disisipkan.
#Insert another record in the "customers" collection, and return the value of the _id field:
mydict = { "name": "Peter", "address": "Lowstreet 27" }
x = mycol.insert_one(mydict)
print(x.inserted_id) # 5b1910482ddb101b7042fcd7
Jika Anda tidak menentukan kolom _id, MongoDB akan menambahkannya untuk Anda dan menetapkan ID unik untuk setiap dokumen.
Pada contoh di atas, kolom _id tidak ditentukan, sehingga MongoDB menetapkan ID unik untuk rekaman (dokumen).
Insert Multiple Documents¶
Untuk memasukkan beberapa dokumen ke dalam koleksi di MongoDB, kita menggunakan metode insert_many().
Parameter pertama metode insert_many() adalah daftar berisi kamus dengan data yang ingin Anda masukkan:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mylist = [
{ "name": "Amy", "address": "Apple st 652"},
{ "name": "Hannah", "address": "Mountain 21"},
{ "name": "Michael", "address": "Valley 345"},
{ "name": "Sandy", "address": "Ocean blvd 2"},
{ "name": "Betty", "address": "Green Grass 1"},
{ "name": "Richard", "address": "Sky st 331"},
{ "name": "Susan", "address": "One way 98"},
{ "name": "Vicky", "address": "Yellow Garden 2"},
{ "name": "Ben", "address": "Park Lane 38"},
{ "name": "William", "address": "Central st 954"},
{ "name": "Chuck", "address": "Main Road 989"},
{ "name": "Viola", "address": "Sideway 1633"}
]
x = mycol.insert_many(mylist)
#print list of the _id values of the inserted documents:
print(x.inserted_ids)
#result: [ObjectId('5b19112f2ddb101964065487'), ObjectId('5b19112f2ddb101964065488'), ObjectId('5b19112f2ddb101964065489'), ObjectId('5b19112f2ddb10196406548a'), ObjectId('5b19112f2ddb10196406548b'), ObjectId('5b19112f2ddb10196406548c'), ObjectId('5b19112f2ddb10196406548d'), ObjectId('5b19112f2ddb10196406548e'), ObjectId('5b19112f2ddb10196406548f'), ObjectId('5b19112f2ddb101964065490'), ObjectId('5b19112f2ddb101964065491'), ObjectId('5b19112f2ddb101964065492')]
Metode insert_many() mengembalikan objek InsertManyResult, yang memiliki properti, inserted_ids, yang menampung id dokumen yang dimasukkan.
Insert Multiple Documents, with Specified IDs¶
Jika Anda tidak ingin MongoDB menetapkan ID unik untuk dokumen Anda, Anda dapat menentukan kolom _id saat memasukkan dokumen.
Ingat bahwa nilainya harus unik. Dua dokumen tidak boleh memiliki _id yang sama.
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mylist = [
{ "_id": 1, "name": "John", "address": "Highway 37"},
{ "_id": 2, "name": "Peter", "address": "Lowstreet 27"},
{ "_id": 3, "name": "Amy", "address": "Apple st 652"},
{ "_id": 4, "name": "Hannah", "address": "Mountain 21"},
{ "_id": 5, "name": "Michael", "address": "Valley 345"},
{ "_id": 6, "name": "Sandy", "address": "Ocean blvd 2"},
{ "_id": 7, "name": "Betty", "address": "Green Grass 1"},
{ "_id": 8, "name": "Richard", "address": "Sky st 331"},
{ "_id": 9, "name": "Susan", "address": "One way 98"},
{ "_id": 10, "name": "Vicky", "address": "Yellow Garden 2"},
{ "_id": 11, "name": "Ben", "address": "Park Lane 38"},
{ "_id": 12, "name": "William", "address": "Central st 954"},
{ "_id": 13, "name": "Chuck", "address": "Main Road 989"},
{ "_id": 14, "name": "Viola", "address": "Sideway 1633"}
]
x = mycol.insert_many(mylist)
#print list of the _id values of the inserted documents:
print(x.inserted_ids)
#result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Find One¶
Catatan
Di MongoDB, kita menggunakan metode find() dan find_one() untuk menemukan data dalam suatu koleksi.
Sama seperti pernyataan SELECT yang digunakan untuk menemukan data dalam tabel di database MySQL.
Untuk memilih data dari suatu koleksi di MongoDB, kita dapat menggunakan metode find_one().
Metode find_one() mengembalikan kemunculan pertama dalam pemilihan.
#Find the first document in the customers collection:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
x = mycol.find_one()
print(x) # {'_id': 1, 'name': 'John', 'address': 'Highway37'}
Find All¶
Untuk memilih data dari tabel di MongoDB, kita juga dapat menggunakan metode find().
Metode find() mengembalikan semua kemunculan dalam pilihan.
Parameter pertama metode find() adalah objek kueri. Dalam contoh ini, kita menggunakan objek kueri kosong, yang memilih semua dokumen dalam koleksi.
Catatan
Metode find() tanpa parameter, yang memberi hasil yang sama seperti SELECT * di MySQL.
#Return all documents in the "customers" collection, and print each document:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
for x in mycol.find():
print(x)
Return Only Some Fields¶
Parameter kedua dari metode find() adalah objek yang menjelaskan kolom mana yang akan disertakan dalam hasil.
Parameter ini bersifat opsional, dan jika dihilangkan, semua kolom akan disertakan dalam hasil.
#Return only the names and addresses, not the _ids:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
for x in mycol.find({},{ "_id": 0, "name": 1, "address": 1 }):
print(x)
Catatan
Anda tidak diperbolehkan menentukan nilai 0 dan 1 dalam objek yang sama (kecuali jika salah satu kolom adalah kolom _id). Jika Anda menentukan kolom dengan nilai 0, semua kolom lainnya akan mendapatkan nilai 1, dan sebaliknya:
#This example will exclude "address" from the result:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
for x in mycol.find({},{ "address": 0 }):
print(x)
Contoh yang SALAH¶
#You get an error if you specify both 0 and 1 values in the same object (except if one of the fields is the _id field):
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
for x in mycol.find({},{ "name": 1, "address": 0 }):
print(x)
Filter the Result¶
Saat mencari dokumen dalam suatu koleksi, Anda dapat memfilter hasilnya menggunakan objek kueri.
Argumen pertama metode find() adalah objek kueri, dan digunakan untuk membatasi pencarian.
#Find document(s) with the address "Park Lane 38":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": "Park Lane 38" }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x) # {'_id': 11, 'name': 'Ben', 'address': 'Park Lane 38'}
Advanced Query¶
Untuk membuat kueri tingkat lanjut, Anda dapat menggunakan pengubah sebagai nilai dalam objek kueri.
Misalnya, untuk menemukan dokumen yang kolom "alamat"-nya dimulai dengan huruf "S" atau lebih tinggi (berdasarkan abjad), gunakan pengubah "lebih besar dari": {"$gt": "S"}:
#Find documents where the address starts with the letter "S" or higher:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": { "$gt": "S" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
#result:
# {'_id': 5, 'name': 'Michael', 'address': 'Valley 345'}
# {'_id': 8, 'name': 'Richard', 'address': 'Sky st 331'}
# {'_id': 10, 'name': 'Vicky', 'address': 'Yellow Garden 2'}
# {'_id': 14, 'name': 'Viola', 'address': 'Sideway 1633'}
Filter With Regular Expressions¶
Anda juga dapat menggunakan ekspresi reguler sebagai pengubah.
Penting
Ekspresi reguler hanya dapat digunakan untuk mengkueri string.
Untuk menemukan hanya dokumen yang kolom "alamat"-nya dimulai dengan huruf "S", gunakan ekspresi reguler {"$regex": "^S"}:
#Find documents where the address starts with the letter "S":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": { "$regex": "^S" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
#result:
# {'_id': 10, 'name': 'Richard', 'address': 'Sky st 331'}
# {'_id': 14, 'name': 'Viola', 'address': 'Sideway 1633'}
Sort the Result¶
Gunakan metode sort() untuk mengurutkan hasil dalam urutan menaik atau menurun.
Metode sort() mengambil satu parameter untuk "fieldname" dan satu parameter untuk "direction" (arah default adalah menaik).
#Sort the result alphabetically by name:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mydoc = mycol.find().sort("name")
for x in mydoc:
print(x)
Sort Descending¶
Gunakan nilai -1 sebagai parameter kedua untuk mengurutkan secara menurun.
sort("name", 1) #ascending
sort("name", -1) #descending
#Sort the result reverse alphabetically by name:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mydoc = mycol.find().sort("name", -1)
for x in mydoc:
print(x)
Delete Document¶
Untuk menghapus satu dokumen, kita menggunakan metode delete_one().
Parameter pertama metode delete_one() adalah objek kueri yang menentukan dokumen mana yang akan dihapus.
Catatan
Jika kueri menemukan lebih dari satu dokumen, hanya kemunculan pertama yang dihapus.
#Delete the document with the address "Mountain 21":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": "Mountain 21" }
mycol.delete_one(myquery)
Delete Many Documents¶
Untuk menghapus lebih dari satu dokumen, gunakan metode delete_many().
Parameter pertama metode delete_many() adalah objek kueri yang menentukan dokumen mana yang akan dihapus.
#Delete all documents were the address starts with the letter S:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": {"$regex": "^S"} }
x = mycol.delete_many(myquery)
print(x.deleted_count, " documents deleted.")
#result: 2 documents deleted.
Delete All Documents in a Collection¶
Untuk menghapus semua dokumen dalam suatu koleksi, berikan objek kueri kosong ke metode delete_many():
#Delete all documents in the "customers" collection:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
x = mycol.delete_many({})
print(x.deleted_count, " documents deleted.")
#result: 11 documents deleted.
Delete Collection¶
Anda dapat menghapus tabel, atau koleksi seperti yang disebut dalam MongoDB, dengan menggunakan metode drop().
#Delete the "customers" collection:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mycol.drop()
Metode drop() mengembalikan true jika koleksi berhasil dijatuhkan, dan false jika koleksi tidak ada.
Update Collection¶
Anda dapat memperbarui rekaman, atau dokumen sebagaimana disebut di MongoDB, dengan menggunakan metode update_one().
Parameter pertama metode update_one() adalah objek kueri yang menentukan dokumen mana yang akan diperbarui.
Catatan
Jika kueri menemukan lebih dari satu rekaman, hanya kemunculan pertama yang diperbarui.
Parameter kedua adalah objek yang mendefinisikan nilai baru dokumen.
#Change the address from "Valley 345" to "Canyon 123":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": "Valley 345" }
newvalues = { "$set": { "address": "Canyon 123" } }
mycol.update_one(myquery, newvalues)
#print "customers" after the update:
for x in mycol.find():
print(x)
Update Many¶
Untuk memperbarui semua dokumen yang memenuhi kriteria kueri, gunakan metode update_many().
#Update all documents where the address starts with the letter "S":
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myquery = { "address": { "$regex": "^S" } }
newvalues = { "$set": { "name": "Minnie" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "documents updated.")
Limit the Result¶
Untuk membatasi hasil di MongoDB, kami menggunakan metode limit().
Metode limit() mengambil satu parameter, yaitu angka yang menentukan jumlah dokumen yang akan dikembalikan.
Misalkan Anda memiliki koleksi "customers":
#customers
{'_id': 1, 'name': 'John', 'address': 'Highway37'}
{'_id': 2, 'name': 'Peter', 'address': 'Lowstreet 27'}
{'_id': 3, 'name': 'Amy', 'address': 'Apple st 652'}
{'_id': 4, 'name': 'Hannah', 'address': 'Mountain 21'}
{'_id': 5, 'name': 'Michael', 'address': 'Valley 345'}
{'_id': 6, 'name': 'Sandy', 'address': 'Ocean blvd 2'}
{'_id': 7, 'name': 'Betty', 'address': 'Green Grass 1'}
{'_id': 8, 'name': 'Richard', 'address': 'Sky st 331'}
{'_id': 9, 'name': 'Susan', 'address': 'One way 98'}
{'_id': 10, 'name': 'Vicky', 'address': 'Yellow Garden 2'}
{'_id': 11, 'name': 'Ben', 'address': 'Park Lane 38'}
{'_id': 12, 'name': 'William', 'address': 'Central st 954'}
{'_id': 13, 'name': 'Chuck', 'address': 'Main Road 989'}
{'_id': 14, 'name': 'Viola', 'address': 'Sideway 1633'}
#Limit the result to only return 5 documents:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
myresult = mycol.find().limit(5)
#print the result:
for x in myresult:
print(x)
#result:
#{'_id': 1, 'name': 'John', 'address': 'Highway37'}
#{'_id': 2, 'name': 'Peter', 'address': 'Lowstreet 27'}
#{'_id': 3, 'name': 'Amy', 'address': 'Apple st 652'}
#{'_id': 4, 'name': 'Hannah', 'address': 'Mountain 21'}
#{'_id': 5, 'name': 'Michael', 'address': 'Valley 345'}