Python?操作?MongoDB數(shù)據(jù)庫(kù)的方法(非?ODM)
一、連接器的安裝和配置
pymongo: MongoDB 官方提供的 Python 工具包。官方文檔: https://pymongo.readthedocs.io/en/stable/ pip安裝,命令如下:
pip install pymongo
來(lái)看看小編挑選的這本書(shū)對(duì)你是否有用:
管理 MongoDB 的主要步驟如下:
- 連接到 MongoDB 數(shù)據(jù)庫(kù)系統(tǒng)
- 管理 MongoDB 數(shù)據(jù)庫(kù)
- 管理 MongoDB 中的集合
- 管理 MongoDB 中的文檔
第一步,連接 MongoDB:
# 方式一: 使用默認(rèn)的配置 client = MongoClient() # 方式二: 指定主機(jī)地址和端口號(hào) client = MongoClient('localhost', 27017) # 方式三: 使用URI連接參數(shù) client = MongoClient('mongodb://localhost:27017/')
第二步,管理數(shù)據(jù)庫(kù):
#通過(guò)MongoClient對(duì)象來(lái)管理多個(gè)數(shù)據(jù)庫(kù)獲取數(shù)據(jù)庫(kù)(邏輯庫(kù))對(duì)象 db = client.DATABASE_NAME db = client["DATABASE_NAME"] db = client.get_database(name=None, *args) # 查看所有的數(shù)據(jù)庫(kù)(邏輯庫(kù)) client.list_databases() # 刪除數(shù)據(jù)庫(kù)(邏輯庫(kù)) client.drop_database(name_or_database, *args)
第三步,管理集合
# 通過(guò)數(shù)據(jù)庫(kù)對(duì)象db來(lái)管理集合 # 獲取集合對(duì)象 db = client.DATABASE_NAME db.COLLECTION_NAME client.DATABASE_NAME.COLLECTION_NAME db.get_collection(name, *args) # 查看當(dāng)前數(shù)據(jù)庫(kù)下的集合列表 db.list_collection_names() # 刪除集合 db.drop_collection(name_or_collection, *args)
基礎(chǔ)操作示例:
# -*- coding: utf-8 -*- # @Time : 2023-03-17 1:47 # @Author : AmoXiang # @File : 1.數(shù)據(jù)庫(kù)連接.py # @Software: PyCharm # @Blog : https://blog.csdn.net/xw1680 from pymongo import MongoClient # 使用默認(rèn)配置連接到數(shù)據(jù)庫(kù) # client = MongoClient() # print(client) # client.close() # 指定主機(jī)地址和端口號(hào)連接到數(shù)據(jù)庫(kù) # client = MongoClient('localhost', 27017) # 使用URI連接參數(shù)連接到數(shù)據(jù)庫(kù) client = MongoClient('mongodb://localhost:27017/') print(client) # client.close() # # # 訪問(wèn)數(shù)據(jù)庫(kù) # db = client.test # db = client["test"] # print(db) # db = client.get_database('test') # client.close() # print(db) # # 查看有哪些數(shù)據(jù)庫(kù) db_list = client.list_databases() # # db_list = client.list_database_names() for item in db_list: print(item) # # 查看數(shù)據(jù)庫(kù)下有哪些集合 db_test = client["test"] for item in db_test.list_collection_names(): print(item) # # # 集合對(duì)象操作 # data = db_test.students.find_one() # data = client.test.students.find_one() data = client.test.get_collection('students').find_one() print(data)
二、新增文檔
說(shuō)明:pymongo 在插入數(shù)據(jù)時(shí)可以將 python 的對(duì)象轉(zhuǎn)換成 BSON
insert_one():插入一個(gè)文檔
# 調(diào)用方法 result = db.COLLECTION_NAME.insert_one(doc) # 返回插入的文檔ID result.inserted _id
insert_many():批量新增文檔。調(diào)用方法:
doc_list = [doc1,doc2] result = db.COLLECTION_NAME.insert_many(doc_list)
示例:
三、查詢(xún)文檔
pymongo 可以將查詢(xún)的結(jié)果轉(zhuǎn)換成 python 中的對(duì)象
常用方法:
find_one(): 按條件查詢(xún)一個(gè)文檔 find(): 按條件查詢(xún)多個(gè)文檔 count_documents(): 統(tǒng)計(jì)滿(mǎn)足條件的文檔總數(shù) aggregate(): 聚合統(tǒng)計(jì) .sort(): 排序 .skip().limit(): 分頁(yè)
示例代碼:
# -*- coding: utf-8 -*- # @Time : 2023-03-18 15:03 # @Author : AmoXiang # @File : 5.查詢(xún)文檔.py # @Software: PyCharm # @Blog : https://blog.csdn.net/xw1680 from bson.objectid import ObjectId from pymongo import MongoClient, ASCENDING, DESCENDING class LearnMongoDBSearch(object): """ MongoDB查詢(xún)練習(xí) """ def __init__(self): self.client = MongoClient() def search_one(self): """ 查詢(xún)一個(gè)文檔 """ temp_obj = self.client.test.newdb.find_one() print(temp_obj) print('喜歡分?jǐn)?shù):', temp_obj['likes']) # print('注冊(cè)時(shí)間:', temp_obj['reg_date'].date()) print('姓名:', temp_obj['uname']) def search_user_by_pk(self, pk): obj_id = ObjectId(pk) # user_obj = self.client.test.newdb.find_one({'_id': obj_id}) # 面向?qū)ο蟮姆椒?,有代碼提示 db = self.client.get_database('test') users = db.get_collection('newdb') user_obj = users.find_one({'_id': obj_id}) print(user_obj) def search_many(self): """ 查詢(xún)多個(gè)文檔 """ db = self.client.get_database('test') students = db.get_collection('students') # stu_list = students.find() # for item in stu_list: # print(item) # 查詢(xún)年齡大于12歲的學(xué)生 stu_list = students.find({'age': {'$gt': 12}}, {'stu_name': 1, 'class_name': 1, 'age': 1}) for item in stu_list: # 注意: mongo中存儲(chǔ)的整數(shù)轉(zhuǎn)換成了浮點(diǎn)數(shù) print(item) def paginate(self, page=1, page_size=10): """ 分頁(yè)處理 :param page: 當(dāng)前的頁(yè) :param page_size: 每一頁(yè)數(shù)據(jù)大小 :return: """ db = self.client.get_database('test') students = db.get_collection('students') offset = (page - 1) * page_size stu_list = students.find().skip(offset).limit(page_size) return stu_list def sort_data(self): """ 排序 """ db = self.client.get_database('test') grades = db.get_collection('grades') # // 將學(xué)生的語(yǔ)文成績(jī)從高到低排序 # db.grades.find({"grade.course_name": "語(yǔ)文"}).sort({"grade.score": -1}); # # //將學(xué)生的語(yǔ)文成績(jī)按照年齡和成績(jī)排序 # db.grades.find({"grade.course_name": "語(yǔ)文"}).sort({"age": -1, "grade.score": -1}); # db.grades.find({"grade.course_name": "語(yǔ)文"}).sort({"grade.score": -1, "age": -1}); # 按某一列排序 # data_list = grades.find({"grade.course_name": "語(yǔ)文"}).sort("grade.score", DESCENDING); # for item in data_list: # print(item) # 按多列排序 data_list = grades.find({"grade.course_name": "語(yǔ)文"}).sort([('age', DESCENDING),("grade.score", DESCENDING),]) for item in data_list: print(item) def counter_students(self): """ 統(tǒng)計(jì)newdb中文檔總數(shù) """ db = self.client.get_database('test') newdb = db.get_collection('newdb') # result = newdb.count_documents({}) result = newdb.count_documents({"uname": {"$eq": "張三"}}) print(result) def test_aggregate(self): """ 聚合統(tǒng)計(jì):及格的學(xué)生成績(jī) """ db = self.client.get_database('test') grades = db.get_collection('grades') result = grades.aggregate([ # //where { '$match': {"grade.score": {'$gte': 60}} }, # //group by { '$group': { '_id': "$stu_no", 'total': {'$sum': 1} } }, # // having { '$match': { 'total': {'$eq': 3} } } ]) for item in result: print(item) if __name__ == '__main__': obj = LearnMongoDBSearch() # obj.search_one() # obj.search_user_by_pk('6411ee77b6170000b4003f95') # obj.search_many() # stu_list = obj.paginate(page=3) # for item in stu_list: # print(item) # obj.sort_data() # obj.counter_students() obj.test_aggregate()
四、更新文檔
回顧,更新數(shù)據(jù)表達(dá)式,如下表所示:
修改一個(gè)文檔,調(diào)用方法:
update_one(filter, update, *args)
替換一個(gè)文檔,調(diào)用方法:
replace_one(filter, replacement, *args)
批量修改文檔,調(diào)用方法:
replace_one(filter, replacement, *args)
快捷方法:
find_one_and_update(filter, update, *args) # 修改一個(gè)文檔 find_one_and_replace(filter, replacement, *args) # 替換一個(gè)文檔 # 注意返回值的不同
返回結(jié)果:
acknowledged:結(jié)果是否已經(jīng)被確認(rèn)
modified_count:修改的文檔數(shù)
matched_count:滿(mǎn)足條件的文檔數(shù)
raw_result:原始數(shù)據(jù)
upserted_id:更新的ID (upsert=True)
示例代碼:
# -*- coding: utf-8 -*- # @Time : 2023-03-18 14:56 # @Author : AmoXiang # @File : 4.修改文檔.py # @Software: PyCharm # @Blog : https://blog.csdn.net/xw1680 from pymongo import MongoClient class LearnMongoDBUpdate(object): """ MongoDB更新練習(xí) """ def __init__(self): self.client = MongoClient() def test_update_one(self): """ 更新一個(gè)文檔 """ db = self.client.get_database('test') newdb = db.get_collection('newdb') result = newdb.update_one({}, {'$set': {'likes': 70}}) print(result.modified_count) def test_replace_one(self): """ 替換一個(gè)文檔 """ db = self.client.get_database('test') newdb = db.get_collection('newdb') result = newdb.replace_one({}, {'uname': '張三'}) print(result.modified_count) def test_update_many(self): """ 批量更新文檔 """ db = self.client.get_database('test') newdb = db.get_collection('newdb') result = newdb.update_many({}, {'$set': {'likes': 90}}) print('修改的數(shù)量:', result.modified_count) print('滿(mǎn)足條件的數(shù)量:', result.matched_count) def test_update_shortcut(self): """ 更新文檔的快捷方法 """ db = self.client.get_database('test') newdb = db.get_collection('newdb') # 此處返回一個(gè)文檔對(duì)象 result = newdb.find_one_and_update({}, {'$set': {'sex': '未知'}}) print(result['_id']) if __name__ == '__main__': obj = LearnMongoDBUpdate() # obj.test_update_one() # obj.test_replace_one() # obj.test_update_many() obj.test_update_shortcut()
五、刪除文檔
刪除一個(gè)文檔,調(diào)用方法如下:
result = db.COLLECTION_NAME.delete_one(filter, *args) # 返回已經(jīng)刪除的記錄數(shù) result.deleted_count # 刪除時(shí)返回文檔對(duì)象 find_one_and_delete(filter, *args)
批量刪除文檔,調(diào)用方法:
result = db.COLLECTION_NAME.delete_many(filter, *args) # 返回已經(jīng)刪除的記錄數(shù) result. deleted_count
示例代碼:
# -*- coding: utf-8 -*- # @Time : 2023-03-18 14:34 # @Author : AmoXiang # @File : 3.刪除文檔.py # @Software: PyCharm # @Blog : https://blog.csdn.net/xw1680 from pymongo import MongoClient class LearnMongoDBDelete(object): """ MongoDB刪除練習(xí) """ def __init__(self): self.client = MongoClient() def test_delete_one(self): """ 刪除一個(gè)文檔 """ db = self.client.get_database('test') newdb = db.get_collection('newdb') result = newdb.delete_one({}) print(result.deleted_count) def test_delete_many(self): """ 批量刪除文檔 """ db = self.client.get_database('test') users = db.get_collection('newdb') # 刪除所有的數(shù)據(jù) result = users.delete_many({"likes": {"$lte": 90}}) print(result.deleted_count) def test_delete_shortcut(self): """ 刪除文檔的快捷方法 """ db = self.client.get_database('test') newdb = db.get_collection('newdb') result = newdb.find_one_and_delete({}) print(result['title']) if __name__ == '__main__': obj = LearnMongoDBDelete() # obj.test_delete_one() # obj.test_delete_shortcut() obj.test_delete_many()
至此今天的學(xué)習(xí)就到此結(jié)束了,筆者在這里聲明,筆者寫(xiě)文章只是為了學(xué)習(xí)交流,以及讓更多學(xué)習(xí)數(shù)據(jù)庫(kù)的讀者少走一些彎路,節(jié)省時(shí)間,并不用做其他用途,如有侵權(quán),聯(lián)系博主刪除即可。感謝您閱讀本篇博文,希望本文能成為您編程路上的領(lǐng)航者。祝您閱讀愉快!
到此這篇關(guān)于Python 操作 MongoDB ----非 ODM的文章就介紹到這了,更多相關(guān)Python 操作 MongoDB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python開(kāi)發(fā)app后端有優(yōu)勢(shì)嗎
在本篇文章里小編給大家整理的是關(guān)于app后端開(kāi)發(fā)學(xué)PHP還是Python的先關(guān)問(wèn)題內(nèi)容,需要的朋友們可以參考下。2020-06-06Selenium 滾動(dòng)頁(yè)面至元素可見(jiàn)的方法
這篇文章主要介紹了Selenium 滾動(dòng)頁(yè)面至元素可見(jiàn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03django 實(shí)現(xiàn)celery動(dòng)態(tài)設(shè)置周期任務(wù)執(zhí)行時(shí)間
今天小編就為大家分享一篇django 實(shí)現(xiàn)celery動(dòng)態(tài)設(shè)置周期任務(wù)執(zhí)行時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11TensorFlow實(shí)現(xiàn)checkpoint文件轉(zhuǎn)換為pb文件
今天小編就為大家分享一篇TensorFlow實(shí)現(xiàn)checkpoint文件轉(zhuǎn)換為pb文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python實(shí)現(xiàn)簡(jiǎn)單的2048小游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單的2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03python實(shí)現(xiàn)while循環(huán)打印星星的四種形狀
今天小編就為大家分享一篇python實(shí)現(xiàn)while循環(huán)打印星星的四種形狀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11使用Python實(shí)現(xiàn)VPN搭建的流程步驟
VPN(虛擬私人網(wǎng)絡(luò))是一種有效的解決方案,可以幫助我們?cè)诰W(wǎng)絡(luò)上匿名瀏覽,保護(hù)數(shù)據(jù)傳輸?shù)陌踩?雖然市面上有許多商業(yè)VPN服務(wù),但你也可以通過(guò)Python自己搭建一個(gè)簡(jiǎn)單的VPN,本文將介紹如何用Python建立自己的VPN,需要的朋友可以參考下2024-06-06