亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

1. 簡介

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()

將數據全部刪除了,程序輸出為空。