python數(shù)據(jù)庫(kù)開(kāi)發(fā)之MongoDB安裝及Python3操作MongoDB數(shù)據(jù)庫(kù)詳細(xì)方法與實(shí)例
MongoDB簡(jiǎn)介
MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。
在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。
MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類(lèi)似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
MongoDB應(yīng)用場(chǎng)景
- 大而復(fù)雜的數(shù)據(jù)
- 移動(dòng)和社會(huì)基礎(chǔ)設(shè)施數(shù)據(jù)
- 內(nèi)容管理和交付
- 用戶(hù)數(shù)據(jù)
- 管理數(shù)據(jù)中心
MongoDB優(yōu)點(diǎn)
- MongoDB 的架構(gòu)較少。它是一個(gè)文檔數(shù)據(jù)庫(kù),它的一個(gè)集合持有不同的文檔。
- 從一個(gè)到另一個(gè)的文檔的數(shù)量,內(nèi)容和大小可能有差異。
- MongoDB 中單個(gè)對(duì)象的結(jié)構(gòu)很清淅。
- MongoDB 中沒(méi)有復(fù)雜的連接。
- MongoDB 提供深度查詢(xún)的功能,因?yàn)樗С謱?duì)文檔的強(qiáng)大的動(dòng)態(tài)查詢(xún)。
- MongoDB 很容易擴(kuò)展。
- 它使用內(nèi)部存儲(chǔ)器來(lái)存儲(chǔ)工作集,這是其快速訪(fǎng)問(wèn)的原因。
MongoDB缺點(diǎn)
- 不支持事務(wù)操作
- 占用空間過(guò)大
- MongoDB沒(méi)有如MySQL那樣成熟的維護(hù)工具
- 無(wú)法進(jìn)行關(guān)聯(lián)表查詢(xún),不適用于關(guān)系多的數(shù)據(jù)
- 復(fù)雜聚合操作通過(guò)mapreduce創(chuàng)建,速度慢
- 模式自由, 自由靈活的文件存儲(chǔ)格式帶來(lái)的數(shù)據(jù)錯(cuò)誤
CentOSP安裝MongoDB
下載安裝MongoDB
下載 3.0.6 版本
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
安裝
tar -zxvf mongodb-linux-x86_64-3.0.6.tgz
移動(dòng)文件夾
mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
增加環(huán)境變量
export PATH=/usr/local/mongodb/bin:$PATH
啟動(dòng)MongoDB
nohup /usr/local/mongodb/bin/mongod --dbpath=/data/db --rest > /usr/local/mongodb/mongo.log 2>&1 &
查看是否啟動(dòng)
netstat -tnlp|grep mongo
端口
27017是默認(rèn)開(kāi)的mongodb端口,28017是默認(rèn)的web訪(fǎng)問(wèn)端口
效果

如果開(kāi)了外網(wǎng)端口,用瀏覽器查看是否外網(wǎng)訪(fǎng)問(wèn)

MongoDB常用命令
連接mongoDB
/usr/local/mongodb/bin/mongo
效果

顯示數(shù)據(jù)庫(kù)列表
show dbs
效果

顯示表單(集合)列表
# 切換分支 use mongodb_test # 顯示列表 show tables # 顯示列表 show collections
show tables 和 show collections 效果相同
效果

查詢(xún)集合所有數(shù)據(jù)
db.col_test.find()
效果

Python3連接操作MongoDB
安裝PyMongo
pip install pymongo
注意事項(xiàng)
注意,如果創(chuàng)建的數(shù)據(jù)庫(kù)、表單中沒(méi)有數(shù)據(jù),是顯示不出來(lái)數(shù)據(jù)庫(kù)的。

顯示數(shù)據(jù)庫(kù)列表
from pymongo import MongoClient
client_ip = "193.112.61.11"
client_port = 27017
my_client = MongoClient(client_ip, client_port)
db_list = my_client.list_database_names()
print("數(shù)據(jù)庫(kù)列表:",db_list)

連接測(cè)試
db = my_client.test
print("db:", db)
testDB(my_client)

db_name = 'mongodb_test' my_db = my_client[db_name]
表單(集合)列表
col_list = my_db.list_collection_names()
沒(méi)有此表單就創(chuàng)建這個(gè)表單,有此表單就連接這個(gè)表單
sheet_tab_one = my_db[name]
Python3增刪改查MongoDB數(shù)據(jù)
增加一條數(shù)據(jù)
# 刪除一條數(shù)據(jù) def delData_one(my_col, myquery): result = my_col.delete_one(myquery) print(result.deleted_count,"數(shù)據(jù)已刪除")
增加多條數(shù)據(jù)
# 刪除多條數(shù)據(jù) def delData_many(my_col, myquery): result = my_col.delete_many(myquery) print(result.deleted_count,"數(shù)據(jù)已刪除")
刪除數(shù)據(jù)
# 刪除一條數(shù)據(jù) def delData_one(my_col, myquery): result = my_col.delete_one(myquery) print(result.deleted_count,"數(shù)據(jù)已刪除")
刪除多條數(shù)據(jù)
# 刪除多條數(shù)據(jù) def delData_many(my_col, myquery): result = my_col.delete_many(myquery) print(result.deleted_count,"數(shù)據(jù)已刪除")
刪除一個(gè)表單
# 刪除一個(gè)表單
def delCol(my_col):
my_col.drop()
print("刪除表單成功")
更新數(shù)據(jù)
# 修改匹配到的第一條數(shù)據(jù) def updateData_one(my_col, myquery, new_val): result = my_col.update_one(myquery, new_val) print(result.modified_count, "文檔已修改")
# 修改匹配到的多條數(shù)據(jù) def updateData_many(my_col, myquery, new_val): result = my_col.update_many(myquery, new_val) print(result.modified_count, "文檔已修改")
查詢(xún)數(shù)據(jù)
# 查詢(xún)一條數(shù)據(jù) def searchData_one(my_col): result = my_col.find_one() print(result)
# 查詢(xún)集合中所有數(shù)據(jù)
def searchData_many(my_col, limit = 0):
for item in my_col.find().limit(limit):
print(item)
根據(jù)指定條件查詢(xún) 或者 正則表達(dá)式查詢(xún)
# my_query = {"name": "ShaShiDi"} # 根據(jù)指定條件查詢(xún)
# my_query = {"name": {"$regex": "^S"}} # 以下實(shí)例用于讀取 name 字段中第一個(gè)字母為 "S" 的數(shù)據(jù)
# 根據(jù)指定條件查詢(xún) 或者正則表達(dá)式查詢(xún)(比如 my_query = { "name": { "$regex": "^S" } })
def searchData_miss(my_col, my_query):
print("根據(jù)指定條件查詢(xún): ", my_query)
my_doc = my_col.find(my_query)
for item in my_doc:
print(item)
排序數(shù)據(jù)
# 按照某字段排序 默認(rèn)True是正序,F(xiàn)alse是倒序
def sortData(my_col, my_key, sortB = True):
if sortB:
my_doc = my_col.find().sort(my_key)
else:
my_doc = my_col.find().sort(my_key, -1)
for item in my_doc:
print(item)
Python3操作MongoDB完整源碼
from pymongo import MongoClient
# 數(shù)據(jù)庫(kù)列表
def ifnotDB(my_client, db_name):
db_list = my_client.list_database_names()
print("數(shù)據(jù)庫(kù)列表:",db_list)
if db_name in db_list:
print("%s 數(shù)據(jù)庫(kù)已存在!"%db_name)
else:
print("%s 數(shù)據(jù)庫(kù)不存在!"%db_name)
# 測(cè)試數(shù)據(jù)庫(kù)是否連接成功 返回測(cè)試結(jié)果
def testDB(my_client):
db = my_client.test
print("db:", db)
return db
# 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) 返回?cái)?shù)據(jù)庫(kù)對(duì)象
def creatDB(my_client, name):
my_db = my_client[name]
ifnotDB(my_client, name)
return my_db
# 表單列表
def ifnotCol(my_db, col_name):
col_list = my_db.list_collection_names()
if col_name in col_list:
print("%s 集合已存在!"%col_name)
else:
print("%s 集合不存在!"%col_name)
# 創(chuàng)建一個(gè)表單 返回表單對(duì)象
def creatCol(my_db, name):
sheet_tab_one = my_db[name]
ifnotCol(my_db, name)
return sheet_tab_one
# 增加一條數(shù)據(jù) 返回_id
def addData_one(my_col, my_json):
result = my_col.insert_one(my_json)
print(result.inserted_id,"增加一條數(shù)據(jù)")# 返回 _id 字段
return result.inserted_id
# 增加多條數(shù)據(jù) 返回所有文檔對(duì)應(yīng)的 _id 值
def addData_many(my_col, my_jsons):
result = my_col.insert_many(my_jsons)
print(result.inserted_ids)
return result.inserted_ids
# 刪除一條數(shù)據(jù)
def delData_one(my_col, myquery):
result = my_col.delete_one(myquery)
print(result.deleted_count,"數(shù)據(jù)已刪除")
# 刪除多條數(shù)據(jù)
def delData_many(my_col, myquery):
result = my_col.delete_many(myquery)
print(result.deleted_count,"數(shù)據(jù)已刪除")
# 刪除一個(gè)表單
def delCol(my_col):
my_col.drop()
print("刪除表單成功")
# 修改匹配到的第一條數(shù)據(jù)
def updateData_one(my_col, myquery, new_val):
result = my_col.update_one(myquery, new_val)
print(result.modified_count, "文檔已修改")
# 修改匹配到的多條數(shù)據(jù)
def updateData_many(my_col, myquery, new_val):
result = my_col.update_many(myquery, new_val)
print(result.modified_count, "文檔已修改")
# 按照某字段排序 默認(rèn)True是正序,F(xiàn)alse是倒序
def sortData(my_col, my_key, sortB = True):
if sortB:
my_doc = my_col.find().sort(my_key)
else:
my_doc = my_col.find().sort(my_key, -1)
for item in my_doc:
print(item)
# 查詢(xún)一條數(shù)據(jù)
def searchData_one(my_col):
result = my_col.find_one()
print(result)
# 查詢(xún)集合中所有數(shù)據(jù)
def searchData_many(my_col, limit = 0):
for item in my_col.find().limit(limit):
print(item)
# 根據(jù)指定條件查詢(xún) 或者正則表達(dá)式查詢(xún)(比如 my_query = { "name": { "$regex": "^S" } })
def searchData_miss(my_col, my_query):
print("根據(jù)指定條件查詢(xún): ", my_query)
my_doc = my_col.find(my_query)
for item in my_doc:
print(item)
if __name__ == "__main__":
client_ip = "服務(wù)器IP地址"
client_port = 27017
db_name = 'mongodb_test'
col_name = 'col_test'
my_json = {"name": "ShaShiDi", "url": "https://shazhenyu.blog.csdn.net/"}
# 可以指定_id 我們也可以自己指定 id,插入
my_jsons = [{"_id": 1,"name": "sha", "url": "https://www.shazhenyu.com"},{"_id": 2,"name": "sha2", "url": "https://shazhenyu.com"}]
my_query = {"name": "ShaShiDi"}
my_query_regex = {"name": {"$regex": "^S"}} # 以下實(shí)例用于讀取 name 字段中第一個(gè)字母為 "S" 的數(shù)據(jù)
my_key = "_id"
new_values = {"$set": {"name": "ShaShiDi_new"}}
my_client = MongoClient(client_ip, client_port)
testDB(my_client)
my_db = creatDB(my_client,db_name)
my_col = creatCol(my_db,col_name)
# # 增加一條數(shù)據(jù)
# addData_one(my_col, my_json)
# # 增加多條數(shù)據(jù)
# addData_many(my_col, my_jsons)
# # 刪除一個(gè)符合條件的集合
# delData_one(my_col, my_query)
# # 刪除所有符合條件的集合
# delData_many(my_col, my_query)
# # 刪除該集合中的所有文檔
# delData_many(my_col, {})
# # 刪除表單
# delCol(my_col)
# # 修改第一個(gè)匹配到的文檔
# updateData_one(my_col, my_query, new_values)
# # 修改所有符合條件的文檔
# updateData_many(my_col, my_query, new_values)
# # 按照某字段排序 默認(rèn)True是正序,F(xiàn)alse是倒序
# sortData(my_col, my_key)
# # 根據(jù)指定條件查詢(xún)
# searchData_miss(my_col, my_query)
# # 根據(jù)正則表達(dá)式查詢(xún)
# searchData_miss(my_col, my_query_regex)
# # 查詢(xún)集合中所有數(shù)據(jù) 如果寫(xiě)第二個(gè)參數(shù),就是指定條數(shù)記錄查詢(xún)
# # searchData_many(my_col)
# searchData_many(my_col,2)
本文主要講解了MongoDB安裝及Python3操作MongoDB數(shù)據(jù)庫(kù)詳細(xì)方法與實(shí)例,更多關(guān)于Python3操作MongoDB數(shù)據(jù)庫(kù)的技巧請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
django實(shí)現(xiàn)模型字段動(dòng)態(tài)choice的操作
這篇文章主要介紹了django實(shí)現(xiàn)模型字段動(dòng)態(tài)choice的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python兩個(gè)list[]相加的實(shí)現(xiàn)方法
這篇文章主要介紹了python兩個(gè)list[]相加的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
python使用mysqldb連接數(shù)據(jù)庫(kù)操作方法示例詳解
這篇文章主要介紹了python mysqldb使用方法,大家參考使用2013-12-12
python在openstreetmap地圖上繪制路線(xiàn)圖的實(shí)現(xiàn)
這篇文章主要介紹了python在openstreetmap地圖上繪制路線(xiàn)圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python之DataFrame實(shí)現(xiàn)excel合并單元格
這篇文章主要為大家詳細(xì)介紹了python之DataFrame實(shí)現(xiàn)excel合并單元格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04

