前言
回顧之前講了python語(yǔ)法編程 ,必修入門基礎(chǔ)和網(wǎng)絡(luò)編程,多線程/多進(jìn)程/協(xié)程等方面的內(nèi)容,昨天和今天講到了數(shù)據(jù)庫(kù)編程篇MySQL,Redis今天第三篇MongoDB篇,前面沒(méi)看的也不用往前翻,系列文已經(jīng)整理好了:
1.跟我一起從零開(kāi)始學(xué)python(一)編程語(yǔ)法必修
2.跟我一起從零開(kāi)始學(xué)python(二)網(wǎng)絡(luò)編程
3.跟我一起從零開(kāi)始學(xué)python(三)多線程/多進(jìn)程/協(xié)程
4.跟我一起從零開(kāi)始學(xué)python(四)數(shù)據(jù)庫(kù)編程:MySQL數(shù)據(jù)庫(kù)
5.跟我一起從零開(kāi)始學(xué)python(五)數(shù)據(jù)庫(kù)編程:Redis數(shù)據(jù)庫(kù)
本篇講:python數(shù)據(jù)庫(kù)編程:MongoDB數(shù)據(jù)庫(kù)
本系列文根據(jù)以下學(xué)習(xí)路線展開(kāi)講述,由于內(nèi)容較多,:
從零開(kāi)始學(xué)python到高級(jí)進(jìn)階路線圖

下章講:機(jī)器學(xué)習(xí)模塊
一丶MongoDB簡(jiǎn)單介紹
Python MongoDB是一種非關(guān)系型數(shù)據(jù)庫(kù),也被稱為NoSQL數(shù)據(jù)庫(kù)。旨在提供高性能、高可用性和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)解決方案。Python MongoDB使用JSON格式存儲(chǔ)數(shù)據(jù),這使得它非常適合處理大量非結(jié)構(gòu)化數(shù)據(jù)。
Python MongoDB的主要特點(diǎn)包括:
高性能:Python MongoDB使用內(nèi)存映射技術(shù),可以快速讀取和寫(xiě)入數(shù)據(jù)。
高可用性:Python MongoDB支持主從復(fù)制和分片技術(shù),可以保證數(shù)據(jù)的可靠性和可用性。
可擴(kuò)展性:Python MongoDB可以輕松地?cái)U(kuò)展到多個(gè)節(jié)點(diǎn),以滿足不斷增長(zhǎng)的數(shù)據(jù)需求。
靈活性:Python MongoDB支持動(dòng)態(tài)模式,可以根據(jù)需要隨時(shí)更改數(shù)據(jù)結(jié)構(gòu)。
易用性:Python MongoDB提供了簡(jiǎn)單易用的API,可以輕松地進(jìn)行數(shù)據(jù)操作。
Python MongoDB的安裝非常簡(jiǎn)單,只需要使用pip命令即可安裝。安裝完成后,可以使用pymongo庫(kù)來(lái)連接和操作MongoDB數(shù)據(jù)庫(kù)。
Python MongoDB的應(yīng)用場(chǎng)景非常廣泛,特別是在大數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)分析方面。它可以用于存儲(chǔ)日志數(shù)據(jù)、社交媒體數(shù)據(jù)、物聯(lián)網(wǎng)數(shù)據(jù)等各種類型的非結(jié)構(gòu)化數(shù)據(jù)。同時(shí),Python MongoDB也可以與其他數(shù)據(jù)存儲(chǔ)解決方案(如關(guān)系型數(shù)據(jù)庫(kù))進(jìn)行集成,以滿足不同的數(shù)據(jù)處理需求。
總之,Python MongoDB是一種高性能、高可用性和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)解決方案,可以幫助開(kāi)發(fā)人員輕松地處理大量非結(jié)構(gòu)化數(shù)據(jù)。
二丶關(guān)于database的基礎(chǔ)命令
MongoDB是一種非關(guān)系型數(shù)據(jù)庫(kù),它使用文檔存儲(chǔ)數(shù)據(jù),而不是使用表格。Python是一種流行的編程語(yǔ)言,它可以與MongoDB數(shù)據(jù)庫(kù)進(jìn)行交互。在Python中,我們可以使用PyMongo庫(kù)來(lái)連接和操作MongoDB數(shù)據(jù)庫(kù)。
在MongoDB中,我們可以使用以下基礎(chǔ)命令來(lái)管理數(shù)據(jù)庫(kù):
創(chuàng)建數(shù)據(jù)庫(kù)
在MongoDB中,我們可以使用use命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。例如,要?jiǎng)?chuàng)建一個(gè)名為mydatabase的數(shù)據(jù)庫(kù),我們可以使用以下命令:
use mydatabase
如果數(shù)據(jù)庫(kù)不存在,則MongoDB將創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)存在,則MongoDB將返回該數(shù)據(jù)庫(kù)的引用。
顯示數(shù)據(jù)庫(kù)
要顯示MongoDB中所有的數(shù)據(jù)庫(kù),我們可以使用以下命令:
show dbs
這將列出MongoDB中所有的數(shù)據(jù)庫(kù)。
刪除數(shù)據(jù)庫(kù)
要?jiǎng)h除MongoDB中的數(shù)據(jù)庫(kù),我們可以使用以下命令:
db.dropDatabase()
這將刪除當(dāng)前選定的數(shù)據(jù)庫(kù)。
切換數(shù)據(jù)庫(kù)
要切換到MongoDB中的另一個(gè)數(shù)據(jù)庫(kù),我們可以使用以下命令:
use anotherdatabase
這將切換到名為anotherdatabase的數(shù)據(jù)庫(kù)。
顯示當(dāng)前數(shù)據(jù)庫(kù)
要顯示當(dāng)前選定的數(shù)據(jù)庫(kù),我們可以使用以下命令:
db
這將返回當(dāng)前選定的數(shù)據(jù)庫(kù)的引用。
總之,Python與MongoDB數(shù)據(jù)庫(kù)的交互非常方便,可以使用PyMongo庫(kù)來(lái)連接和操作MongoDB數(shù)據(jù)庫(kù)。在Python中,我們可以使用基礎(chǔ)命令來(lái)管理數(shù)據(jù)庫(kù),例如創(chuàng)建、顯示、刪除和切換數(shù)據(jù)庫(kù)。
三丶關(guān)于集合的基礎(chǔ)命令
Python MongoDB數(shù)據(jù)庫(kù)關(guān)于集合的基礎(chǔ)命令
在Python中使用MongoDB數(shù)據(jù)庫(kù)時(shí),集合是MongoDB中的一個(gè)重要概念。集合類似于關(guān)系型數(shù)據(jù)庫(kù)中的表,但是MongoDB是一個(gè)文檔型數(shù)據(jù)庫(kù),因此集合中存儲(chǔ)的是文檔。
以下是Python MongoDB數(shù)據(jù)庫(kù)關(guān)于集合的基礎(chǔ)命令:
創(chuàng)建集合
要?jiǎng)?chuàng)建一個(gè)集合,可以使用MongoDB的db.create_collection()方法。在Python中,可以使用pymongo庫(kù)中的Collection類的insert_one()方法來(lái)創(chuàng)建集合。
import pymongo
# 連接MongoDB數(shù)據(jù)庫(kù)
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 創(chuàng)建一個(gè)名為mycollection的集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]
插入文檔
要向集合中插入文檔,可以使用MongoDB的db.collection.insert()方法。在Python中,可以使用pymongo庫(kù)中的Collection類的insert_one()方法來(lái)插入文檔。
import pymongo
# 連接MongoDB數(shù)據(jù)庫(kù)
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]
# 插入一條文檔
mydict = { "name": "John", "address": "Highway 37" }
x = mycol.insert_one(mydict)
查詢文檔
要查詢集合中的文檔,可以使用MongoDB的db.collection.find()方法。在Python中,可以使用pymongo庫(kù)中的Collection類的find()方法來(lái)查詢文檔。
import pymongo
# 連接MongoDB數(shù)據(jù)庫(kù)
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]
# 查詢所有文檔
for x in mycol.find():
print(x)
更新文檔
要更新集合中的文檔,可以使用MongoDB的db.collection.update()方法。在Python中,可以使用pymongo庫(kù)中的Collection類的update_one()方法來(lái)更新文檔。
import pymongo
# 連接MongoDB數(shù)據(jù)庫(kù)
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]
# 更新一條文檔
myquery = { "address": "Highway 37" }
newvalues = { "$set": { "address": "Park Lane 38" } }
mycol.update_one(myquery, newvalues)
刪除文檔
要?jiǎng)h除集合中的文檔,可以使用MongoDB的db.collection.remove()方法。在Python中,可以使用pymongo庫(kù)中的Collection類的delete_one()方法來(lái)刪除文檔。
import pymongo
# 連接MongoDB數(shù)據(jù)庫(kù)
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 獲取mycollection集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]
# 刪除一條文檔
myquery = { "address": "Park Lane 38" }
mycol.delete_one(myquery)
四丶數(shù)據(jù)類型
MongoDB數(shù)據(jù)庫(kù)支持以下數(shù)據(jù)類型:
String(字符串):存儲(chǔ)文本數(shù)據(jù),最常用的數(shù)據(jù)類型。
Integer(整型):存儲(chǔ)整數(shù)。
Boolean(布爾型):存儲(chǔ)布爾值(true/false)。
Double(雙精度浮點(diǎn)型):存儲(chǔ)浮點(diǎn)數(shù)。
Min/Max keys(最小值/最大值):用于比較值的最小值和最大值。
Arrays(數(shù)組):用于存儲(chǔ)數(shù)組或列表。
Timestamp(時(shí)間戳):記錄文檔修改或添加的時(shí)間。
Object(對(duì)象):用于嵌入式文檔。
Null(空值):用于表示空值或不存在的字段。
Symbol(符號(hào)):類似于字符串,但是用于特定的上下文環(huán)境。
Date(日期):用于存儲(chǔ)日期和時(shí)間。
Object ID(對(duì)象ID):用于唯一標(biāo)識(shí)文檔。
Binary data(二進(jìn)制數(shù)據(jù)):用于存儲(chǔ)二進(jìn)制數(shù)據(jù),如圖片、音頻等。
Code(代碼):用于存儲(chǔ)JavaScript代碼。
Regular expression(正則表達(dá)式):用于存儲(chǔ)正則表達(dá)式。
五丶數(shù)據(jù)操作
Python中操作MongoDB數(shù)據(jù)庫(kù)的方式有多種,可以使用官方提供的pymongo庫(kù),也可以使用第三方庫(kù)mongoengine等。
以下是pymongo庫(kù)的基本數(shù)據(jù)操作:
連接數(shù)據(jù)庫(kù)
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['testdb']
插入數(shù)據(jù)
collection = db['testcollection']
data = {'name': 'Tom', 'age': 18}
collection.insert_one(data)
查詢數(shù)據(jù)
# 查詢所有數(shù)據(jù)
result = collection.find()
for item in result:
print(item)
# 查詢指定條件的數(shù)據(jù)
result = collection.find({'name': 'Tom'})
for item in result:
print(item)
更新數(shù)據(jù)
# 更新一條數(shù)據(jù)
collection.update_one({'name': 'Tom'}, {'$set': {'age': 20}})
# 更新多條數(shù)據(jù)
collection.update_many({'name': 'Tom'}, {'$set': {'age': 20}})
刪除數(shù)據(jù)
# 刪除一條數(shù)據(jù)
collection.delete_one({'name': 'Tom'})
# 刪除多條數(shù)據(jù)
collection.delete_many({'name': 'Tom'})
聚合操作
# 統(tǒng)計(jì)數(shù)據(jù)總數(shù)
count = collection.count_documents({})
# 按條件分組統(tǒng)計(jì)
result = collection.aggregate([
{'$group': {'_id': '$name', 'count': {'$sum': 1}}}
])
for item in result:
print(item)
以上是pymongo庫(kù)的基本數(shù)據(jù)操作,其他庫(kù)的操作方式也類似
六丶數(shù)據(jù)的備份與恢復(fù)
Python中備份和恢復(fù)MongoDB數(shù)據(jù)庫(kù)可以使用mongodump和mongorestore命令,也可以使用pymongo庫(kù)中的函數(shù)進(jìn)行操作。
使用mongodump和mongorestore命令備份和恢復(fù)MongoDB數(shù)據(jù)庫(kù)
備份MongoDB數(shù)據(jù)庫(kù):
mongodump --host <host> --port <port> --db <database> --out <backup_directory>
其中,<host>是MongoDB服務(wù)器的IP地址或主機(jī)名,<port>是MongoDB服務(wù)器的端口號(hào),默認(rèn)為27017,<database>是要備份的數(shù)據(jù)庫(kù)名稱,<backup_directory>是備份文件存放的目錄。
恢復(fù)MongoDB數(shù)據(jù)庫(kù):
mongorestore --host <host> --port <port> --db <database> <backup_directory>
其中,<host>、<port>、<database>和<backup_directory>的含義與備份命令相同。
使用pymongo庫(kù)備份和恢復(fù)MongoDB數(shù)據(jù)庫(kù)
備份MongoDB數(shù)據(jù)庫(kù):
import pymongo
import datetime
client = pymongo.MongoClient("<mongodb_uri>")
db = client["<database>"]
collection = db["<collection>"]
backup = collection.find()
with open("<backup_file>", "w") as f:
for doc in backup:
f.write(str(doc) + "\n")
其中,<mongodb_uri>是MongoDB服務(wù)器的URI,<database>和<collection>是要備份的數(shù)據(jù)庫(kù)和集合名稱,<backup_file>是備份文件的路徑。
恢復(fù)MongoDB數(shù)據(jù)庫(kù):
import pymongo
client = pymongo.MongoClient("<mongodb_uri>")
db = client["<database>"]
collection = db["<collection>"]
with open("<backup_file>", "r") as f:
for line in f:
doc = eval(line.strip())
collection.insert_one(doc)
其中,<mongodb_uri>、<database>、<collection>和<backup_file>的含義與備份命令相同。注意,這種方法只適用于備份和恢復(fù)小型數(shù)據(jù)庫(kù),對(duì)于大型數(shù)據(jù)庫(kù),建議使用mongodump和mongorestore命令進(jìn)行操作。
七丶聚合操作
MongoDB的聚合操作是指將多個(gè)文檔進(jìn)行分組、篩選、排序、計(jì)算等操作,以生成新的文檔集合的過(guò)程。Python中可以使用pymongo庫(kù)來(lái)進(jìn)行MongoDB的聚合操作。
以下是一個(gè)簡(jiǎn)單的聚合操作示例,假設(shè)我們有一個(gè)名為students的集合,其中包含每個(gè)學(xué)生的姓名、年齡和成績(jī):
from pymongo import MongoClient
client = MongoClient()
db = client['test']
collection = db['students']
pipeline = [
{"$group": {"_id": "$age", "avg_score": {"$avg": "$score"}}},
{"$sort": {"_id": 1}}
]
result = collection.aggregate(pipeline)
for doc in result:
print(doc)
上述代碼中,我們使用了MongoDB的group和group和avg操作符來(lái)計(jì)算每個(gè)年齡段的平均成績(jī),并使用$sort操作符按年齡升序排序。最終的結(jié)果將會(huì)是一個(gè)包含每個(gè)年齡段平均成績(jī)的文檔集合。
除了group和group和avg操作符外,MongoDB還提供了許多其他的聚合操作符,如match、match、project、sort、sort、limit等,可以根據(jù)具體需求進(jìn)行組合使用。
八丶索引
MongoDB中的索引是用于提高查詢性能的一種數(shù)據(jù)結(jié)構(gòu)。在MongoDB中,可以使用多種類型的索引,包括單字段索引、復(fù)合索引、全文索引等。
以下是使用Python操作MongoDB索引的示例:
創(chuàng)建單字段索引
from pymongo import MongoClient
client = MongoClient()
db = client.test_database
collection = db.test_collection
# 創(chuàng)建單字段索引
collection.create_index("name")
# 查詢是否創(chuàng)建成功
print(collection.index_information())
創(chuàng)建復(fù)合索引
from pymongo import MongoClient
client = MongoClient()
db = client.test_database
collection = db.test_collection
# 創(chuàng)建復(fù)合索引
collection.create_index([("name", 1), ("age", -1)])
# 查詢是否創(chuàng)建成功
print(collection.index_information())
創(chuàng)建全文索引
from pymongo import MongoClient
client = MongoClient()
db = client.test_database
collection = db.test_collection
# 創(chuàng)建全文索引
collection.create_index([("content", "text")])
# 查詢是否創(chuàng)建成功
print(collection.index_information())
查詢使用索引
from pymongo import MongoClient
client = MongoClient()
db = client.test_database
collection = db.test_collection
# 查詢使用索引
result = collection.find({"name": "Tom"}).explain()["executionStats"]
print(result)
以上是Python操作MongoDB索引的示例,可以根據(jù)實(shí)際需求選擇不同類型的索引來(lái)提高查詢性能。
九丶pymongo的操作
Python中操作MongoDB數(shù)據(jù)庫(kù)需要使用pymongo庫(kù),以下是pymongo庫(kù)的常用操作:
連接MongoDB數(shù)據(jù)庫(kù)
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
選擇數(shù)據(jù)庫(kù)
db = client['database_name']
選擇集合
collection = db['collection_name']
插入文檔
data = {'name': 'John', 'age': 25}
collection.insert_one(data)
查詢文檔
result = collection.find_one({'name': 'John'})
更新文檔
collection.update_one({'name': 'John'}, {'$set': {'age': 30}})
刪除文檔
collection.delete_one({'name': 'John'})
查詢多個(gè)文檔
results = collection.find({'age': {'$gt': 20}})
for result in results:
print(result)
以上是pymongo庫(kù)的常用操作,可以根據(jù)實(shí)際需求進(jìn)行調(diào)用。
本系列文根據(jù)以下學(xué)習(xí)路線展開(kāi)講述,由于內(nèi)容較多,:
從零開(kāi)始學(xué)python到高級(jí)進(jìn)階路線圖

下章講:機(jī)器學(xué)習(xí)模塊