1. 程式人生 > Python進階應用教學 >28 使用 Python 操作 Mongo 資料庫

28 使用 Python 操作 Mongo 資料庫

MongoDB 是一個基於分散式檔案儲存的資料庫,旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,它支援的查詢語言非常強大,其語法類似於面向物件的查詢語言,可以實現類似關係資料庫單表查詢的絕大部分功能。

Python 程式要訪問 MongoDB,需要使用第三方模組 pymongo。

2. 安裝 pymongo

pymongo 是 python 訪問 mysql 資料庫的模組。首先檢查是否已經安裝了 pymongo 模組,在 python 互動模式下 import pymongo,如下所示:

>>> import
pymongo Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'pymongo'

如果出現錯誤:ModuleNotFoundError,則表示還沒有安裝 pymongo,使用 pip3 install mysql 安裝 pymongo,如下所示:

$ pip3 install pymongo
Collecting pymongo
...
Installing collected packages: pymongo
Successfully installed pymongo-3.10.1

3. 啟動 MongoDB

在 MonoDB 中建立資料庫 school,在後面的小節中,將對資料庫 school 進行增刪改查。輸入如下命令啟動 MongoDB:

$ mkdir school
$ mongod --dbpath=./school >/dev/null
  • 在第 1 行,建立目錄 school,用於存放 MongoDB 資料庫 school 的內容
  • 在第 2 行,啟動 MongoDB 的服務,指定 dbpath 為目錄 school

4. 連線資料庫

pymongo.MongoClient 方法連線 MongoDB,返回一個 MongoCLient 物件,示例如下:

import
pymongo def open_db(): global mongo global school global students mongo = pymongo.MongoClient('mongodb://localhost') school = mongo['school'] students = school['students']
  • 在第 1 行,引入 pymongo 模組
  • 在第 3 行,定義方法 open_db() 連線 MongoDB,後面的例子會引用該方法
  • 在第 4 行到第 6 行,宣告 3 個全域性變數
    • mongo 是連線 MongoDB 的物件
    • school 是 MongoDB 中的資料庫
    • students 是 MongoDB 中的表
  • 在第 8 行,使用 ‘mongodb://localhost’ 作為 url 連線本地的 MongoDB
  • 在第 9 行,在 MongoDB 中建立資料庫 school
  • 在第 10 行,在資料庫 school 中建立表 students

5. 列出資料

MongoDB 的表提供了 find() 方法,查詢表中的所有資料,類似 SQL 中的 SELECT * 操作:

def list_students():
    for student in students.find():
        print(student)
  • 在第 1 行,定義方法 list_students() 列出所有的學生的資訊,後面的例子會引用該方法
  • 在第 2 行,students.find() 查詢表 students 中所有的資料

6. 增加資料

6.1 增加一條資料

MongoDB 的表提供了 insert() 方法,向表中插入一條資料:

def add_one_student(sno, name, age):
    student = {'sno': sno, 'name': name, 'age': age}
    students.insert_one(student)
  • 在第 1 行,函式 add_one_student 向表 students 增加一個學生
  • 在第 2 行,構造一個字典物件 student
  • 在第 3 行,將字典 student 插入到表 students 中

編寫測試程式如下:

add_one_student('1', 'tom', 11)
add_one_student('2', 'jerry', 12)
list_students()

程式執行輸出如下:

{'_id': ObjectId('5ee328013ee9af43360b7a65'), 'sno': '1', 'name': 'tom', 'age': 11}
{'_id': ObjectId('5ee328013ee9af43360b7a66'), 'sno': '2', 'name': 'jerry', 'age': 12}

6.2 增加多條資料

MongoDB 的表提供了 insert_many() 方法,向表中插入多條資料:

def add_many_students():
    tom = {'sno': '1', 'name': 'tom', 'age': 11}
    jerry = {'sno': '2', 'name': 'jerry', 'age': 12}
    array = [tom, jerry]
    students.insert_many(array)
  • 在第 1 行,函式 add_many_students 向表 students 增加多個學生
  • 在第 2 行,構造一個字典物件 tom
  • 在第 3 行,構造一個字典物件 jerry
  • 在第 5 行,將學生 tom 和學生 jerry 插入到表 students 中

編寫測試程式如下:

add_many_students()
list_students()

程式執行輸出如下:

{'_id': ObjectId('5ee3281b673bfa2333f3c1f1'), 'sno': '1', 'name': 'tom', 'age': 11}
{'_id': ObjectId('5ee3281b673bfa2333f3c1f2'), 'sno': '2', 'name': 'jerry', 'age': 12}

6.3 用於測試的資料

編寫函式 add_students_for_test,向表 students 中插入 4 條資料用於測試,在後面的小節將引用這個函式。

def add_students_for_test():
    add_one_student('1', '張三', 11)
    add_one_student('2', '李四', 12)
    add_one_student('3', '王五', 13)
    add_one_student('4', '李四', 14)

7. 修改資料

7.1 修改一條資料

MongoDB 的表提供了 update_one() 方法,修改表中符合查詢條件的第一條資料:

def update_one_student(sno, name):
    condition = {'sno': sno}
    value = {'$set': {'name': name}}
    students.update_one(condition, value)
  • 在第 2 行,設定查詢條件為學號 sno
  • 在第 3 行,修改查詢結果的姓名 name
  • 在第 4 行,查詢表 students 中學號為 sno 的學生,修改符合查詢條件的第一個學生的姓名 name

編寫測試程式如下:

add_students_for_test()
update_one_student('1', 'ZhangSan')
update_one_student('2', 'LiSi')
list_students() 
  • 在第 2 行,查詢學號為 ‘1’ 的學生,將其姓名 name 修改為 ‘ZhangSan’
  • 在第 3 行,查詢學號為 ‘2’ 的學生,將其姓名 name 修改為 ‘LiSi’

程式執行輸出如下:

{'_id': ObjectId('5ee3284f14c80d192f214ea0'), 'sno': '1', 'name': 'ZhangSan', 'age': 11}
{'_id': ObjectId('5ee3284f14c80d192f214ea1'), 'sno': '2', 'name': 'LiSi', 'age': 12}
{'_id': ObjectId('5ee3284f14c80d192f214ea2'), 'sno': '3', 'name': '王五', 'age': 13}
{'_id': ObjectId('5ee3284f14c80d192f214ea3'), 'sno': '4', 'name': '李四', 'age': 14}

7.2 修改多條資料

MongoDB 的表提供了 update_many() 方法,修改表中符合查詢條件的所有資料:

def update_many_students(old_name, new_name):
    condition = {'name': old_name}
    value = {'$set': {'name': new_name}}
    students.update_many(condition, value)
  • 在第 2 行,設定查詢條件為姓名 name
  • 在第 3 行,修改查詢結果的姓名 name
  • 在第 4 行,查詢表 students 中姓名為 name 的學生,修改所有符合查詢條件學生的姓名 name

編寫測試程式如下:

add_students_for_test()
update_many_students('李四', 'LiSi')
list_students()
  • 在第 2 行,查詢姓名為 ‘李四’ 的學生,將其姓名 name 修改為 ‘LiSi’

程式執行輸出如下:

{'_id': ObjectId('5ee328758ab7b33517380c8f'), 'sno': '1', 'name': '張三', 'age': 11}
{'_id': ObjectId('5ee328758ab7b33517380c90'), 'sno': '2', 'name': 'LiSi', 'age': 12}
{'_id': ObjectId('5ee328758ab7b33517380c91'), 'sno': '3', 'name': '王五', 'age': 13}
{'_id': ObjectId('5ee328758ab7b33517380c92'), 'sno': '4', 'name': 'LiSi', 'age': 14}

8. 刪除資料

8.1 刪除一條資料

MongoDB 的表提供了 delete_one() 方法,刪除表中符合查詢條件的第一條資料:

def delete_one_student(sno):
    student = {'sno': sno}
    students.delete_one(student)
  • 在第 2 行,設定查詢條件為學號 sno
  • 在第 3 行,查詢表 students 中學號為 sno 的學生,刪除符合查詢條件的第一個學生

編寫測試程式如下:

add_students_for_test()
delete_one_student('1')
delete_one_student('2')
list_students()
  • 在第 2 行,刪除學號為 ‘1’ 的學生
  • 在第 3 行,刪除學號為 ‘2’ 的學生

程式執行輸出如下:

{'_id': ObjectId('5ee328a441b99d0ffd2127ab'), 'sno': '3', 'name': '王五', 'age': 13}
{'_id': ObjectId('5ee328a441b99d0ffd2127ac'), 'sno': '4', 'name': '李四', 'age': 14}

8.2 刪除多條資料

MongoDB 的表提供了 delete_many() 方法,刪除表中所有符合查詢條件的資料:

def delete_many_students(name):
    student = {'name': name}
    students.delete_many(student)
  • 在第 2 行,設定查詢條件為姓名 name
  • 在第 3 行,查詢表 students 中姓名為 name 的學生,刪除所有符合查詢條件的學生

編寫測試程式如下:

add_students_for_test()
delete_many_students('李四')
list_students()

程式執行輸出如下:

{'_id': ObjectId('5ee328d182f2558674a683db'), 'sno': '1', 'name': '張三', 'age': 11}
{'_id': ObjectId('5ee328d182f2558674a683dd'), 'sno': '3', 'name': '王五', 'age': 13}

8.3 刪除所有資料

如果如果傳遞給 delete_many() 一個空的查詢物件,則刪除表中所有的資料:

def delete_all_students():
    student = {}
    students.delete_many(student)

編寫測試程式如下:

add_students_for_test()
delete_all_students()
list_students()

將資料全部刪除了,程式輸出為空。