java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍
MongoDB 是一款面向文檔型的 NoSQL 數(shù)據(jù)庫,是一個(gè)基于分布式文件存儲的開源的非關(guān)系型數(shù)據(jù)庫系統(tǒng),其內(nèi)容是以 K/V 形式存儲,結(jié)構(gòu)不固定,它的字段值可以包含其他文檔、數(shù)組和文檔數(shù)組等。其采用的 BSON(二進(jìn)制 JSON )的數(shù)據(jù)結(jié)構(gòu),可以提高存儲和掃描效率,但空間開銷會(huì)有些大。今天就為大家簡單介紹下在 Python 中使用 MongoDB 。
安裝 PyMongo 庫
在 Python 中操作 MongoDB ,需要使用 PyMongo 庫,執(zhí)行如下命令安裝:
pip3 install pymongo連接 MongoDB 數(shù)據(jù)庫
連接時(shí)需要使用 PyMongo 庫里面的 MongoClient 模塊,有兩種方式可以創(chuàng)建連接,默認(rèn)只需要傳入IP和端口號即可。如果數(shù)據(jù)庫存在賬號密碼,則需要指定連接的數(shù)據(jù)庫,并進(jìn)行鑒權(quán)才能連接成功。
#導(dǎo)入 MongoClient 模塊from pymongo import MongoClient, ASCENDING, DESCENDING# 兩種方式#1. 傳入數(shù)據(jù)庫IP和端口號mc = MongoClient('127.0.0.1', 27017)#2. 直接傳入連接字串mc = MongoClient('mongodb://127.0.0.1:27017')# 有密碼的連接# 首先指定連接testdb數(shù)據(jù)庫db = mc.testdb# 通過authenticate方法認(rèn)證賬號密碼db.authenticate('username','password')# 檢查是否連接成功,輸出以下結(jié)果表示連接成功print(mc.server_info())# {'version': '4.2.1', 'gitVersion': 'edf6d45851c0b9ee15548f0f847df141764a317e', 'modules': [], 'allocator': 'tcmalloc', 'javascriptEngine': 'mozjs', 'sysInfo': 'deprecated', 'versionArray': [4, 2, 1, 0], 'openssl': {'running': 'OpenSSL 1.1.1 11 Sep 2018', 'compiled': 'OpenSSL 1.1.1 11 Sep 2018'}, ……省略 , 'ok': 1.0}MongoDB 數(shù)據(jù)庫操作
成功連接數(shù)據(jù)庫,接下來我們開始介紹通過 MongoClient 模塊如何對 mongoDB 數(shù)據(jù)庫進(jìn)行 CURD 的操作。
獲取數(shù)據(jù)庫和集合
首先要指定需要操作的數(shù)據(jù)庫和集合,這里的數(shù)據(jù)庫可以對應(yīng)為 Mysql 的 DataBase,集合對應(yīng)為 Mysql 的 Table。需要注意的是在 mongoDB 中,不需要提前創(chuàng)建數(shù)據(jù)庫和集合,在你操作它們時(shí)如果沒有則會(huì)自動(dòng)創(chuàng)建,但都是延時(shí)創(chuàng)建的,在添加 Document 時(shí)才會(huì)真正創(chuàng)建。
# 指定操作數(shù)據(jù)庫的兩種方式#1. 獲取 testdb 數(shù)據(jù)庫,沒有則自動(dòng)創(chuàng)建db = mc.testdb#2. 效果與上面 db = mc.testdb 相同db = mc['testdb']# 打印出testdb數(shù)據(jù)庫下所有集合(表)print(db.collection_names())# 指定操作集合的兩種方式#1. 獲取 test 集合,沒有則自動(dòng)創(chuàng)建collection = db.test#2. 效果與 collection = db.test 相同collection = db['test']# 打印集合中一行數(shù)據(jù)print(collection.find_one())數(shù)據(jù)的插入操作
在 MongoDB 中,每條數(shù)據(jù)其實(shí)都有一個(gè) _id 屬性作為唯一標(biāo)識。如果沒有顯式指明該屬性,MongoDB 會(huì)自動(dòng)產(chǎn)生一個(gè) ObjectId 類型的 _id 屬性,insert() 方法會(huì)在執(zhí)行后返回 _id 值。不過在 PyMongo 3.x 版本中,官方已經(jīng)不推薦使用 insert() 方法,而是推薦使用insert_one() 和 insert_many() 方法來分別插入單條記錄和多條記錄。
# 要插入到集合中的對象book = { 'name' : 'Python基礎(chǔ)', 'author' : '張三', 'page' : 80}# 向集合中插入一條記錄collection.insert_one(book)# 返回結(jié)果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基礎(chǔ)', 'author': '張三', 'page': 80}# 對于insert_many()方法,我們可以將數(shù)據(jù)以列表形式傳遞參數(shù)book1 = { 'name' : 'Java基礎(chǔ)', 'author' : '李白', 'page' : 100}book2 = { 'name' : 'Java虛擬機(jī)', 'author' : '王五', 'page' : 100}# 創(chuàng)建 book_list 列表book_list = [book1, book2]# 向集合中插入多條記錄collection.insert_many(book_list)# 返回結(jié)果:數(shù)據(jù)的查詢操作
查詢需要使用 find_one() 或 find() 方法,其中 find_one() 查詢得到的是單個(gè)結(jié)果,即一條記錄,find() 則返回一個(gè)生成器對象。下面我們就來查詢上面剛插入的數(shù)據(jù),如果查詢不到數(shù)據(jù)則返回 None ,代碼如下:
# 通過條件查詢一條記錄,如果不存在則返回Noneres = collection.find_one({'author': '張三'})print (res)# 打印結(jié)果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基礎(chǔ)', 'author': '張三', 'page': 80}# 通過條件查詢多條記錄,如果不存在則返回Noneres = collection.find({'page': 100})print (res)#打印結(jié)果:# 使用 find() 查詢會(huì)返回一個(gè)對象# 遍歷對象,并打印查詢結(jié)果for r in res: print(r)#打印結(jié)果:# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基礎(chǔ)', 'author': '李白', 'page': 100}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虛擬機(jī)', 'author': '王五', 'page': 100}# 查詢page大于50的記錄res = collection.find({'page': {'$gt': 50}})# 通過遍歷返回對象,結(jié)果如下:# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基礎(chǔ)', 'author': '張三', 'page': 80}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基礎(chǔ)', 'author': '李白', 'page': 100}# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虛擬機(jī)', 'author': '王五', 'page': 100}上面查詢條件中我們用到了 $gt 的比較運(yùn)算符,關(guān)于查詢條件中的比較運(yùn)算符和功能運(yùn)算符對照表如下:
| $gt | 大于 | {'page': {'$gt': 50} |
| $lt | 小于 | |
| $lte | 小于等于 | |
| $gte | 大于等于 | |
| $ne | 不等于 | |
| $in | 在范圍內(nèi) | {'page': {'$in': [50, 100]}} |
| $nin | 不在范圍內(nèi) | {'page': {'$nin': [50, 100]}} |
| $regex | 匹配正則表達(dá)式 | {'name': {'$regex': '^張.*'}} |
| $exists | 屬性是否存在 | {'name': {'$exists': True}} |
| $type | 類型判斷 | {'name': {'$type': 'string'}} |
| $mod | 數(shù)字模操作 | {'page': {'$mod': [80, 10]}} |
| $text | 文本查詢 | {'$text': {'$search': 'Java'}} |
| $where | 高級條件查詢 | {'$where': 'obj. author == obj. full_name'} |
數(shù)據(jù)的更新操作
更新操作和插入操作類似,PyMongo 提供了兩種更新方法,即 update_one() 和 update_many() 方法,其中 update_one() 方法只會(huì)更新滿足條件的第一條記錄。
注意:
- 如果使用 $set,則只更新 book 對象內(nèi)存在的字段,如果更新前還有其他字段,則不更新也不刪除。
- 如果不使用 $set,則會(huì)把更新前的數(shù)據(jù)全部用 book 對象替換,如果原本存在其他字段則會(huì)被刪除。
集合的刪除操作
刪除數(shù)據(jù)同樣推薦使用兩個(gè)方法 delete_one() 和 delete_many() ,其中 delete_one() 為刪除第一條符合條件的記錄。具體操作代碼如下:
# 刪除滿足條件的第一條記錄result = collection.delete_one({'author': '張三'})# 同樣可以通過返回對象的 deleted_count 屬性查詢刪除的記錄數(shù)print(result.deleted_count)# 打印結(jié)果:1# 刪除滿足條件的所有記錄,以下為刪除 page < 90 的記錄result = collection.delete_many({'page': {'$lt': 90}})print(result.deleted_count)# 打印結(jié)果:1其他數(shù)據(jù)庫操作
除了以上標(biāo)準(zhǔn)的數(shù)據(jù)庫操作外,PyMongo 還提供了以下通用且方便的操作方法,比如 limit() 方法用來讀取指定數(shù)量的數(shù)據(jù)skip() 方法用來跳過指定數(shù)量的數(shù)據(jù)等,具體請看如下代碼:
# 查詢返回滿足條件的記錄然后刪除result = collection.find_one_and_delete({'author': '王五'}) print(result)# 打印結(jié)果:{'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虛擬機(jī)', 'author': '王五', 'page': 110}# 統(tǒng)計(jì)查詢結(jié)果個(gè)數(shù)# 全部結(jié)果個(gè)數(shù)collection.find().count()# 返回結(jié)果:1# 滿足條件結(jié)果個(gè)數(shù)collection.find({'page': 100}).count()# 返回結(jié)果:0# 查詢結(jié)果按字段排序# 升序results = collection.find().sort('page', ASCENDING)# 降序results = collection.find().sort('page', DESCENDING)# 下面查詢結(jié)果是按page升序排序,只返回第二條記錄及以后的兩條結(jié)果results = collection.find().sort('page', ASCENDING).skip(1).limit(2)print(results)注意:在數(shù)據(jù)量在在千萬、億級別龐大的時(shí)候,查詢時(shí)最好 skip() 的值不要太大,這樣很可能導(dǎo)致內(nèi)存溢出。
數(shù)據(jù)索引操作
默認(rèn)情況下,數(shù)據(jù)插入時(shí)已經(jīng)有一個(gè) _id 索引了,當(dāng)然我們還可以創(chuàng)建自定義索引。
# unique=True時(shí),創(chuàng)建一個(gè)唯一索引,索引字段插入相同值時(shí)會(huì)自動(dòng)報(bào)錯(cuò),默認(rèn)為Falsecollection.create_index('page', unique= True)# 打印結(jié)果:'page_1'# 打印出已創(chuàng)建的索引print(collection.index_information())# 返回結(jié)果:{'_id_': {'v': 2, 'key': [('_id', 1)], 'ns': 'testdb.test'}, 'page_1': {'v': 2, 'unique': True, 'key': [('page', 1)], 'ns': 'testdb.test'}}# 刪除索引collection.drop_index('page_1')#刪除集合collection.drop()總結(jié)
本文為大家介紹了 Python 中如何創(chuàng)建連接 MongoDB 數(shù)據(jù)庫,并通過代碼的方式展示了對 MongoDB 數(shù)據(jù)的增刪改查以及排序索引等操作,通過以上學(xué)習(xí)個(gè)人感覺操作起來還是比較簡單方便的。今天就先介紹到這里,以后還會(huì)為大家介紹其他數(shù)據(jù)庫的操作。
參考
PyMongo 文檔:https://pymongo.readthedocs.io/en/stable/
示例代碼:https://github.com/JustDoPython/python-100-day
系列文章第77天:Python 操作 SQLite第76天:Python Scrapy 模擬登陸第75天:Python 操作 Redis 數(shù)據(jù)庫介紹第74天:Python newspaper 框架第73天:itchat 微信機(jī)器人簡介第72天:PySpider框架的使用第71天:Python Scrapy 項(xiàng)目實(shí)戰(zhàn)從 0 學(xué)習(xí) Python 0 - 70 大合集總結(jié)PS:公號內(nèi)回復(fù) :Python,即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起100天計(jì)劃!-END-Python 技術(shù)關(guān)于 Python 都在這里總結(jié)
以上是生活随笔為你收集整理的java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何选择适合的Web开发语言?
- 下一篇: One take,可望而不可即