前言
回顧之前講了python語法編程 ,必修入門基礎(chǔ)和網(wǎng)絡(luò)編程,多線程/多進(jìn)程/協(xié)程等方面的內(nèi)容沉帮,昨天和今天講到了數(shù)據(jù)庫編程篇MySQL屡萤,Redis今天第三篇MongoDB篇珍剑,前面沒看的也不用往前翻,系列文已經(jīng)整理好了:
1.跟我一起從零開始學(xué)python(一)編程語法必修
2.跟我一起從零開始學(xué)python(二)網(wǎng)絡(luò)編程
3.跟我一起從零開始學(xué)python(三)多線程/多進(jìn)程/協(xié)程
4.跟我一起從零開始學(xué)python(四)數(shù)據(jù)庫編程:MySQL數(shù)據(jù)庫
5.跟我一起從零開始學(xué)python(五)數(shù)據(jù)庫編程:Redis數(shù)據(jù)庫
本篇講:python數(shù)據(jù)庫編程:MongoDB數(shù)據(jù)庫
本系列文根據(jù)以下學(xué)習(xí)路線展開講述死陆,由于內(nèi)容較多招拙,:
從零開始學(xué)python到高級(jí)進(jìn)階路線圖
下章講:機(jī)器學(xué)習(xí)模塊
一丶MongoDB簡(jiǎn)單介紹
Python MongoDB是一種非關(guān)系型數(shù)據(jù)庫,也被稱為NoSQL數(shù)據(jù)庫翔曲。旨在提供高性能迫像、高可用性和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)解決方案。Python MongoDB使用JSON格式存儲(chǔ)數(shù)據(jù)瞳遍,這使得它非常適合處理大量非結(jié)構(gòu)化數(shù)據(jù)闻妓。
Python MongoDB的主要特點(diǎn)包括:
高性能:Python MongoDB使用內(nèi)存映射技術(shù),可以快速讀取和寫入數(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庫來連接和操作MongoDB數(shù)據(jù)庫烙荷。
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ù)庫)進(jìn)行集成匾旭,以滿足不同的數(shù)據(jù)處理需求镣屹。
總之,Python MongoDB是一種高性能季率、高可用性和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)解決方案野瘦,可以幫助開發(fā)人員輕松地處理大量非結(jié)構(gòu)化數(shù)據(jù)。
二丶關(guān)于database的基礎(chǔ)命令
MongoDB是一種非關(guān)系型數(shù)據(jù)庫飒泻,它使用文檔存儲(chǔ)數(shù)據(jù)鞭光,而不是使用表格。Python是一種流行的編程語言泞遗,它可以與MongoDB數(shù)據(jù)庫進(jìn)行交互惰许。在Python中,我們可以使用PyMongo庫來連接和操作MongoDB數(shù)據(jù)庫史辙。
在MongoDB中汹买,我們可以使用以下基礎(chǔ)命令來管理數(shù)據(jù)庫:
創(chuàng)建數(shù)據(jù)庫
在MongoDB中,我們可以使用use命令來創(chuàng)建一個(gè)新的數(shù)據(jù)庫聊倔。例如晦毙,要?jiǎng)?chuàng)建一個(gè)名為mydatabase
的數(shù)據(jù)庫,我們可以使用以下命令:
use mydatabase
如果數(shù)據(jù)庫不存在耙蔑,則MongoDB將創(chuàng)建一個(gè)新的數(shù)據(jù)庫见妒。如果數(shù)據(jù)庫已經(jīng)存在,則MongoDB將返回該數(shù)據(jù)庫的引用甸陌。
顯示數(shù)據(jù)庫
要顯示MongoDB中所有的數(shù)據(jù)庫须揣,我們可以使用以下命令:
show dbs
這將列出MongoDB中所有的數(shù)據(jù)庫。
刪除數(shù)據(jù)庫
要?jiǎng)h除MongoDB中的數(shù)據(jù)庫钱豁,我們可以使用以下命令:
db.dropDatabase()
這將刪除當(dāng)前選定的數(shù)據(jù)庫耻卡。
切換數(shù)據(jù)庫
要切換到MongoDB中的另一個(gè)數(shù)據(jù)庫,我們可以使用以下命令:
use anotherdatabase
這將切換到名為anotherdatabase
的數(shù)據(jù)庫牲尺。
顯示當(dāng)前數(shù)據(jù)庫
要顯示當(dāng)前選定的數(shù)據(jù)庫卵酪,我們可以使用以下命令:
db
這將返回當(dāng)前選定的數(shù)據(jù)庫的引用。
總之谤碳,Python與MongoDB數(shù)據(jù)庫的交互非常方便凛澎,可以使用PyMongo
庫來連接和操作MongoDB數(shù)據(jù)庫。在Python中估蹄,我們可以使用基礎(chǔ)命令來管理數(shù)據(jù)庫,例如創(chuàng)建沫换、顯示臭蚁、刪除和切換數(shù)據(jù)庫最铁。
三丶關(guān)于集合的基礎(chǔ)命令
Python MongoDB數(shù)據(jù)庫關(guān)于集合的基礎(chǔ)命令
在Python中使用MongoDB數(shù)據(jù)庫時(shí),集合是MongoDB中的一個(gè)重要概念垮兑。集合類似于關(guān)系型數(shù)據(jù)庫中的表冷尉,但是MongoDB是一個(gè)文檔型數(shù)據(jù)庫,因此集合中存儲(chǔ)的是文檔系枪。
以下是Python MongoDB數(shù)據(jù)庫關(guān)于集合的基礎(chǔ)命令:
創(chuàng)建集合
要?jiǎng)?chuàng)建一個(gè)集合雀哨,可以使用MongoDB的db.create_collection()
方法。在Python中私爷,可以使用pymongo
庫中的Collection
類的insert_one()
方法來創(chuàng)建集合雾棺。
import pymongo
# 連接MongoDB數(shù)據(jù)庫
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 創(chuàng)建一個(gè)名為mycollection的集合
mydb = client["mydatabase"]
mycol = mydb["mycollection"]
插入文檔
要向集合中插入文檔,可以使用MongoDB的db.collection.insert()
方法衬浑。在Python中捌浩,可以使用pymongo
庫中的Collection
類的insert_one()
方法來插入文檔。
import pymongo
# 連接MongoDB數(shù)據(jù)庫
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
庫中的Collection
類的find()
方法來查詢文檔助币。
import pymongo
# 連接MongoDB數(shù)據(jù)庫
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
庫中的Collection
類的update_one()
方法來更新文檔迹栓。
import pymongo
# 連接MongoDB數(shù)據(jù)庫
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
庫中的Collection
類的delete_one()
方法來刪除文檔。
import pymongo
# 連接MongoDB數(shù)據(jù)庫
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ù)庫支持以下數(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ù)庫的方式有多種警医,可以使用官方提供的pymongo
庫亿胸,也可以使用第三方庫mongoengine
等。
以下是pymongo
庫的基本數(shù)據(jù)操作:
連接數(shù)據(jù)庫
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
庫的基本數(shù)據(jù)操作预皇,其他庫的操作方式也類似
六丶數(shù)據(jù)的備份與恢復(fù)
Python中備份和恢復(fù)MongoDB數(shù)據(jù)庫可以使用mongodump
和mongorestore
命令侈玄,也可以使用pymongo
庫中的函數(shù)進(jìn)行操作。
使用mongodump
和mongorestore
命令備份和恢復(fù)MongoDB數(shù)據(jù)庫
備份MongoDB數(shù)據(jù)庫:
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ù)庫名稱诱桂,<backup_directory>是備份文件存放的目錄。
恢復(fù)MongoDB數(shù)據(jù)庫:
mongorestore --host <host> --port <port> --db <database> <backup_directory>
其中呈昔,<host>挥等、<port>、<database>和<backup_directory>的含義與備份命令相同堤尾。
使用pymongo
庫備份和恢復(fù)MongoDB數(shù)據(jù)庫
備份MongoDB數(shù)據(jù)庫:
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ù)庫和集合名稱郭宝,<backup_file>是備份文件的路徑辞槐。
恢復(fù)MongoDB數(shù)據(jù)庫:
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ù)庫鹿榜,對(duì)于大型數(shù)據(jù)庫,建議使用mongodump
和mongorestore
命令進(jìn)行操作锦爵。
七丶聚合操作
MongoDB的聚合操作是指將多個(gè)文檔進(jìn)行分組舱殿、篩選、排序险掀、計(jì)算等操作沪袭,以生成新的文檔集合的過程。Python中可以使用pymongo庫來進(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操作符來計(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í)際需求選擇不同類型的索引來提高查詢性能溯革。
九丶pymongo的操作
Python中操作MongoDB數(shù)據(jù)庫需要使用pymongo
庫贞绳,以下是pymongo
庫的常用操作:
連接MongoDB數(shù)據(jù)庫
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
選擇數(shù)據(jù)庫
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
庫的常用操作,可以根據(jù)實(shí)際需求進(jìn)行調(diào)用致稀。
本系列文根據(jù)以下學(xué)習(xí)路線展開講述冈闭,由于內(nèi)容較多,:
從零開始學(xué)python到高級(jí)進(jìn)階路線圖
下章講:機(jī)器學(xué)習(xí)模塊