1. 簡(jiǎn)介
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,它支持的查詢語言非常強(qiáng)大,其語法類似于面向?qū)ο蟮牟樵冋Z言,可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能。
Python 程序要訪問 MongoDB,需要使用第三方模塊 pymongo。
2. 安裝 pymongo
pymongo 是 python 訪問 mysql 數(shù)據(jù)庫的模塊。首先檢查是否已經(jīng)安裝了 pymongo 模塊,在 python 交互模式下 import pymongo,如下所示:
>>> import pymongo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'pymongo'
如果出現(xiàn)錯(cuò)誤:ModuleNotFoundError,則表示還沒有安裝 pymongo,使用 pip3 install mysql 安裝 pymongo,如下所示:
$ pip3 install pymongo
Collecting pymongo
...
Installing collected packages: pymongo
Successfully installed pymongo-3.10.1
3. 啟動(dòng) MongoDB
在 MonoDB 中創(chuàng)建數(shù)據(jù)庫 school,在后面的小節(jié)中,將對(duì)數(shù)據(jù)庫 school 進(jìn)行增刪改查。輸入如下命令啟動(dòng) MongoDB:
$ mkdir school
$ mongod --dbpath=./school >/dev/null
- 在第 1 行,創(chuàng)建目錄 school,用于存放 MongoDB 數(shù)據(jù)庫 school 的內(nèi)容
- 在第 2 行,啟動(dòng) MongoDB 的服務(wù),指定 dbpath 為目錄 school
4. 連接數(shù)據(jù)庫
pymongo.MongoClient 方法連接 MongoDB,返回一個(gè) MongoCLient 對(duì)象,示例如下:
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,后面的例子會(huì)引用該方法
- 在第 4 行到第 6 行,聲明 3 個(gè)全局變量
- mongo 是連接 MongoDB 的對(duì)象
- school 是 MongoDB 中的數(shù)據(jù)庫
- students 是 MongoDB 中的表
- 在第 8 行,使用 ‘mongodb://localhost’ 作為 url 連接本地的 MongoDB
- 在第 9 行,在 MongoDB 中創(chuàng)建數(shù)據(jù)庫 school
- 在第 10 行,在數(shù)據(jù)庫 school 中創(chuàng)建表 students
5. 列出數(shù)據(jù)
MongoDB 的表提供了 find() 方法,查詢表中的所有數(shù)據(jù),類似 SQL 中的 SELECT * 操作:
def list_students():
for student in students.find():
print(student)
- 在第 1 行,定義方法 list_students() 列出所有的學(xué)生的信息,后面的例子會(huì)引用該方法
- 在第 2 行,students.find() 查詢表 students 中所有的數(shù)據(jù)
6. 增加數(shù)據(jù)
6.1 增加一條數(shù)據(jù)
MongoDB 的表提供了 insert() 方法,向表中插入一條數(shù)據(jù):
def add_one_student(sno, name, age):
student = {'sno': sno, 'name': name, 'age': age}
students.insert_one(student)
- 在第 1 行,函數(shù) add_one_student 向表 students 增加一個(gè)學(xué)生
- 在第 2 行,構(gòu)造一個(gè)字典對(duì)象 student
- 在第 3 行,將字典 student 插入到表 students 中
編寫測(cè)試程序如下:
add_one_student('1', 'tom', 11)
add_one_student('2', 'jerry', 12)
list_students()
程序運(yùn)行輸出如下:
{'_id': ObjectId('5ee328013ee9af43360b7a65'), 'sno': '1', 'name': 'tom', 'age': 11}
{'_id': ObjectId('5ee328013ee9af43360b7a66'), 'sno': '2', 'name': 'jerry', 'age': 12}
6.2 增加多條數(shù)據(jù)
MongoDB 的表提供了 insert_many() 方法,向表中插入多條數(shù)據(jù):
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 行,函數(shù) add_many_students 向表 students 增加多個(gè)學(xué)生
- 在第 2 行,構(gòu)造一個(gè)字典對(duì)象 tom
- 在第 3 行,構(gòu)造一個(gè)字典對(duì)象 jerry
- 在第 5 行,將學(xué)生 tom 和學(xué)生 jerry 插入到表 students 中
編寫測(cè)試程序如下:
add_many_students()
list_students()
程序運(yùn)行輸出如下:
{'_id': ObjectId('5ee3281b673bfa2333f3c1f1'), 'sno': '1', 'name': 'tom', 'age': 11}
{'_id': ObjectId('5ee3281b673bfa2333f3c1f2'), 'sno': '2', 'name': 'jerry', 'age': 12}
6.3 用于測(cè)試的數(shù)據(jù)
編寫函數(shù) add_students_for_test,向表 students 中插入 4 條數(shù)據(jù)用于測(cè)試,在后面的小節(jié)將引用這個(gè)函數(shù)。
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. 修改數(shù)據(jù)
7.1 修改一條數(shù)據(jù)
MongoDB 的表提供了 update_one() 方法,修改表中符合查詢條件的第一條數(shù)據(jù):
def update_one_student(sno, name):
condition = {'sno': sno}
value = {'$set': {'name': name}}
students.update_one(condition, value)
- 在第 2 行,設(shè)置查詢條件為學(xué)號(hào) sno
- 在第 3 行,修改查詢結(jié)果的姓名 name
- 在第 4 行,查詢表 students 中學(xué)號(hào)為 sno 的學(xué)生,修改符合查詢條件的第一個(gè)學(xué)生的姓名 name
編寫測(cè)試程序如下:
add_students_for_test()
update_one_student('1', 'ZhangSan')
update_one_student('2', 'LiSi')
list_students()
- 在第 2 行,查找學(xué)號(hào)為 ‘1’ 的學(xué)生,將其姓名 name 修改為 ‘ZhangSan’
- 在第 3 行,查找學(xué)號(hào)為 ‘2’ 的學(xué)生,將其姓名 name 修改為 ‘LiSi’
程序運(yùn)行輸出如下:
{'_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 修改多條數(shù)據(jù)
MongoDB 的表提供了 update_many() 方法,修改表中符合查詢條件的所有數(shù)據(jù):
def update_many_students(old_name, new_name):
condition = {'name': old_name}
value = {'$set': {'name': new_name}}
students.update_many(condition, value)
- 在第 2 行,設(shè)置查詢條件為姓名 name
- 在第 3 行,修改查詢結(jié)果的姓名 name
- 在第 4 行,查詢表 students 中姓名為 name 的學(xué)生,修改所有符合查詢條件學(xué)生的姓名 name
編寫測(cè)試程序如下:
add_students_for_test()
update_many_students('李四', 'LiSi')
list_students()
- 在第 2 行,查找姓名為 ‘李四’ 的學(xué)生,將其姓名 name 修改為 ‘LiSi’
程序運(yùn)行輸出如下:
{'_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. 刪除數(shù)據(jù)
8.1 刪除一條數(shù)據(jù)
MongoDB 的表提供了 delete_one() 方法,刪除表中符合查詢條件的第一條數(shù)據(jù):
def delete_one_student(sno):
student = {'sno': sno}
students.delete_one(student)
- 在第 2 行,設(shè)置查詢條件為學(xué)號(hào) sno
- 在第 3 行,查詢表 students 中學(xué)號(hào)為 sno 的學(xué)生,刪除符合查詢條件的第一個(gè)學(xué)生
編寫測(cè)試程序如下:
add_students_for_test()
delete_one_student('1')
delete_one_student('2')
list_students()
- 在第 2 行,刪除學(xué)號(hào)為 ‘1’ 的學(xué)生
- 在第 3 行,刪除學(xué)號(hào)為 ‘2’ 的學(xué)生
程序運(yùn)行輸出如下:
{'_id': ObjectId('5ee328a441b99d0ffd2127ab'), 'sno': '3', 'name': '王五', 'age': 13}
{'_id': ObjectId('5ee328a441b99d0ffd2127ac'), 'sno': '4', 'name': '李四', 'age': 14}
8.2 刪除多條數(shù)據(jù)
MongoDB 的表提供了 delete_many() 方法,刪除表中所有符合查詢條件的數(shù)據(jù):
def delete_many_students(name):
student = {'name': name}
students.delete_many(student)
- 在第 2 行,設(shè)置查詢條件為姓名 name
- 在第 3 行,查詢表 students 中姓名為 name 的學(xué)生,刪除所有符合查詢條件的學(xué)生
編寫測(cè)試程序如下:
add_students_for_test()
delete_many_students('李四')
list_students()
程序運(yùn)行輸出如下:
{'_id': ObjectId('5ee328d182f2558674a683db'), 'sno': '1', 'name': '張三', 'age': 11}
{'_id': ObjectId('5ee328d182f2558674a683dd'), 'sno': '3', 'name': '王五', 'age': 13}
8.3 刪除所有數(shù)據(jù)
如果如果傳遞給 delete_many() 一個(gè)空的查詢對(duì)象,則刪除表中所有的數(shù)據(jù):
def delete_all_students():
student = {}
students.delete_many(student)
編寫測(cè)試程序如下:
add_students_for_test()
delete_all_students()
list_students()
將數(shù)據(jù)全部刪除了,程序輸出為空。