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'}