Python如何使用pymongo連接MongoDB數(shù)據(jù)庫并進行相關操作
一、基本概述
目前電腦上已經(jīng)下載了MongoDB數(shù)據(jù)庫、navicat for mongodb作為mongoDB的可視化工具,形如navicat for mysql作為mysql的可視化工具。
使用Pycharm編寫python代碼連接mongodb,創(chuàng)建數(shù)據(jù)庫,創(chuàng)建集合(集合是指形如mysql中的sql數(shù)據(jù)表)等操作。
使用pymongo進行數(shù)據(jù)庫連接,因此需要在pycharm中下載。
二、創(chuàng)建數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫需要使用 MongoClient 對象,并且指定連接的 URL 地址和要創(chuàng)建的數(shù)據(jù)庫名。
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") #新建數(shù)據(jù)庫 mydb = myclient["runoobdbs"]
注意:
此時navicat還無法看見新建的數(shù)據(jù)庫,這是因為在 MongoDB 中,數(shù)據(jù)庫只有在內容插入后才會創(chuàng)建!
就是說,數(shù)據(jù)庫創(chuàng)建后要創(chuàng)建集合(數(shù)據(jù)表)并插入一個文檔(記錄),數(shù)據(jù)庫才會真正創(chuàng)建。
三、判斷數(shù)據(jù)庫是否存在
代碼如下:
#判斷數(shù)據(jù)庫是否存在 dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫名 # dblist = myclient.database_names() if "runoobdbs" in dblist: print("數(shù)據(jù)庫已存在!")
四、創(chuàng)建集合
代碼如下:
#創(chuàng)建集合 mycol = mydb["sites"]
五、判斷集合是否存在
代碼如下:
#判斷集合是否存在 collist = mydb. list_collection_names() #獲取集合名 # collist = mydb.collection_names() if "sites" in collist: # 判斷 sites 集合是否存在 print("集合已存在!")
此時仍舊無法顯示數(shù)據(jù)庫和集合名。
六、插入文檔
1.插入單個文檔
文檔就是指的里面的數(shù)據(jù)。
#插入文檔 mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"} x = mycol.insert_one(mydict) print(x)
若是沒有數(shù)據(jù)庫、集合在,此代碼上面要有創(chuàng)建數(shù)據(jù)庫、創(chuàng)建集合的代碼。
代碼運行前MongoDB顯示數(shù)據(jù)庫名稱:
代碼運行后MongoDB顯示數(shù)據(jù)庫名稱:
運行后navicat fo rmongodb顯示如下:
Pycharm運行第一次結果:
第二次運行結果:
此時全部代碼有:
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") #新建數(shù)據(jù)庫 mydb = myclient["runoobdbs"] #判斷數(shù)據(jù)庫是否存在 dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫名 # dblist = myclient.database_names() if "runoobdbs" in dblist: print("數(shù)據(jù)庫已存在!") #創(chuàng)建集合 mycol = mydb["sites"] #判斷集合是否存在 collist = mydb. list_collection_names() #獲取集合名 # collist = mydb.collection_names() if "sites" in collist: # 判斷 sites 集合是否存在 print("集合已存在!") #插入文檔 mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"} x = mycol.insert_one(mydict) print(x)
2.返回 _id 字段
insert_one() 方法返回 InsertOneResult 對象,該對象包含 inserted_id 屬性,它是插入文檔的 id 值。
返回 _id 字段只需要在以上代碼最后下再加一句print(x.inserted_id)
即可。
結果是:
而此時由于運行了三次,出現(xiàn)了三行內容一樣,id不一樣的文檔。
3.插入多個文檔
集合中插入多個文檔使用 insert_many() 方法,該方法的第一參數(shù)是字典列表。
代碼如下:
#插入多個文檔 mylist = [ {"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com"}, {"name": "QQ", "alexa": "101", "url": "https://www.qq.com"}, {"name": "Facebook", "alexa": "10", "url": "https://www.facebook.com"}, {"name": "知乎", "alexa": "103", "url": "https://www.zhihu.com"}, {"name": "Github", "alexa": "109", "url": "https://www.github.com"} ] x = mycol.insert_many(mylist) # 輸出插入的所有文檔對應的 _id 值 print(x.inserted_ids)
Pycharm運行結果:
navicat顯示如下:
也可以使用MongoDB查看。
補充:
use+空格+數(shù)據(jù)庫
,作用是數(shù)據(jù)庫不在時新建,在時切換到此數(shù)據(jù)庫下。db.creatCollection('集合名')
,創(chuàng)建集合。db.集合名.find()
方法顯示此集合下所有數(shù)據(jù)。
4.插入指定 _id 的多個文檔
我們也可以自己指定 id,插入,以下實例我們在 site2 集合中插入數(shù)據(jù),_id 為我們指定的:
mycol2 = mydb["site2"] mylist2 = [ {"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥教程"}, {"_id": 2, "name": "Google", "address": "Google 搜索"}, {"_id": 3, "name": "Facebook", "address": "臉書"}, {"_id": 4, "name": "Taobao", "address": "淘寶"}, {"_id": 5, "name": "Zhihu", "address": "知乎"} ] x = mycol2.insert_many(mylist2) # 輸出插入的所有文檔對應的 _id 值 print(x.inserted_ids)
Pycharm運行結果:
navicat顯示如下:
此時全部代碼如下:
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") #新建數(shù)據(jù)庫 mydb = myclient["runoobdbs"] #創(chuàng)建集合 mycol = mydb["sites"] ''' #判斷數(shù)據(jù)庫是否存在 dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫名 # dblist = myclient.database_names() if "runoobdbs" in dblist: print("數(shù)據(jù)庫已存在!") #判斷集合是否存在 collist = mydb. list_collection_names() #獲取集合名 # collist = mydb.collection_names() if "sites" in collist: # 判斷 sites 集合是否存在 print("集合已存在!") ''' #插入文檔 #mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"} #x = mycol.insert_one(mydict) #print(x) #print(x.inserted_id) #插入多個文檔 #mylist = [ # {"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com"}, # {"name": "QQ", "alexa": "101", "url": "https://www.qq.com"}, # {"name": "Facebook", "alexa": "10", "url": "https://www.facebook.com"}, # {"name": "知乎", "alexa": "103", "url": "https://www.zhihu.com"}, # {"name": "Github", "alexa": "109", "url": "https://www.github.com"} #] #x = mycol.insert_many(mylist) # 輸出插入的所有文檔對應的 _id 值 #print(x.inserted_ids) #插入多條不同id的文檔 mycol2 = mydb["site2"] mylist2 = [ {"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥教程"}, {"_id": 2, "name": "Google", "address": "Google 搜索"}, {"_id": 3, "name": "Facebook", "address": "臉書"}, {"_id": 4, "name": "Taobao", "address": "淘寶"}, {"_id": 5, "name": "Zhihu", "address": "知乎"} ] x = mycol2.insert_many(mylist2) # 輸出插入的所有文檔對應的 _id 值 print(x.inserted_ids)
七、查詢文檔
本節(jié)上個內容有顯示MongoDB查詢文檔的操作,在Pycharm里如何實現(xiàn)查詢呢?
1.查詢一條數(shù)據(jù)
#查詢一條數(shù)據(jù) x = mycol.find_one() print(x)
Pycharm運行結果:
2.查詢集合中所有數(shù)據(jù)
find() 方法可以查詢集合中的所有數(shù)據(jù),類似 SQL 中的 SELECT * 操作。
#查詢所有數(shù)據(jù) for x in mycol.find(): print(x)
Pycharm運行結果:
3.查詢指定字段的數(shù)據(jù)
我們可以使用 find() 方法來查詢指定字段的數(shù)據(jù),將要返回的字段對應值設置為 1。
除了 _id,你不能在一個對象中同時指定 0 和 1,如果你設置了一個字段為 0,則其他都為 1,反之亦然。
不能出現(xiàn)類似這樣的代碼for x in mycol.find({},{ "name": 1, "alexa": 0 }):
。
#返回指定字段 for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }): #意思是只返回name和alexa,不要id print(x) for x in mycol.find({},{ "alexa": 0 }): #除了alexa字段,其他都返回 print(x)
運行結果是:
4.根據(jù)指定條件查詢
我們可以在 find() 中設置參數(shù)來過濾數(shù)據(jù)。
#根據(jù)指定條件查詢 myquery = {"name": "RUNOOB"} mydoc = mycol.find(myquery) for x in mydoc: print(x)
運行結果:
5.高級查詢
查詢的條件語句中,我們還可以使用修飾符。
以下實例用于讀取 name 字段中第一個字母 ASCII 值大于 “H” 的數(shù)據(jù),大于的修飾符條件為 {“$gt”: “H”} :
#高級查詢 myquery = { "name": { "$gt": "H" }} mydoc = mycol.find(myquery) for x in mydoc: print(x)
運行結果:
MongoDB中條件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
6.使用正則表達式查詢
我們還可以使用正則表達式作為修飾符。
正則表達式修飾符只用于搜索字符串的字段。
以下實例用于讀取 name 字段中第一個字母為 “R” 的數(shù)據(jù),正則表達式修飾符條件為 {“$regex”: “^R”} :
$regex為模糊查詢的字符串提供正則表達式功能。
#使用正則表達式查詢 myquery = {"name": {"$regex": "^R"}} #查詢name中以R開頭的數(shù)據(jù) mydoc = mycol.find(myquery) for x in mydoc: print(x)
運行結果:
7.返回指定條數(shù)記錄
如果我們要對查詢結果設置指定條數(shù)的記錄可以使用 limit() 方法,該方法只接受一個數(shù)字參數(shù)。
以下實例返回 3 條文檔記錄:
#返回指定條數(shù) myresult = mycol.find().limit(3) #查詢前三條數(shù)據(jù) # 輸出結果 for x in myresult: print(x)
八、修改文檔
在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個參數(shù)為查詢的條件,第二個參數(shù)為要修改的字段。
如果查找到的匹配數(shù)據(jù)多于一條,則只會修改第一條。
更新前的數(shù)據(jù)如下:
代碼如下:
#修改一條數(shù)據(jù) myquery = {"alexa": "10000"} #將alexa的10000的數(shù)據(jù)值改為12345 newvalues = {"$set": {"alexa": "12345"}} mycol.update_one(myquery, newvalues) # 輸出修改后的 "sites" 集合 for x in mycol.find(): print(x)
更新后:
update_one() 方法只能修匹配到的第一條記錄,如果要修改所有匹配到的記錄,可以使用 update_many()。
以下實例將查找所有以 F 開頭的 name 字段,并將匹配到所有記錄的 alexa 字段修改為 123:
#修改多條數(shù)據(jù) myquery = {"name": {"$regex": "^F"}} #尋找以F開頭的name,將其alexa值改為123 newvalues = {"$set": {"alexa": "123"}} x = mycol.update_many(myquery, newvalues) print(x.modified_count, "文檔已修改")
更新后:
九、排序
sort() 方法可以指定升序或降序排序。
sort() 方法第一個參數(shù)為要排序的字段,第二個字段指定排序規(guī)則,1 為升序,-1 為降序,默認為升序。
#排序 將alexa以升序排序 mydoc = mycol.find().sort("alexa") for x in mydoc: print(x)
結果如下:
降序排序:
#alexa降序 mydoc = mycol.find().sort("alexa", -1) for x in mydoc: print(x)
結果如下:
十、刪除文檔
1.刪除一個文檔
使用 delete_one() 方法來刪除一個文檔,該方法第一個參數(shù)為查詢對象,指定要刪除哪些數(shù)據(jù)。
刪除前的數(shù)據(jù)庫如圖:
#刪除一條數(shù)據(jù) myquery = { "name": "Taobao" } mycol.delete_one(myquery) # 刪除后輸出 for x in mycol.find(): print(x)
刪除后:
2.刪除多個文檔
我們可以使用 delete_many() 方法來刪除多個文檔,該方法第一個參數(shù)為查詢對象,指定要刪除哪些數(shù)據(jù)。
刪除所有 name 字段中以 F 開頭的文檔:
#刪除多條數(shù)據(jù) myquery = {"name": {"$regex": "^F"}} x = mycol.delete_many(myquery) print(x.deleted_count, "個文檔已刪除")
刪除后:
3.刪除集合中的所有文檔
delete_many() 方法如果傳入的是一個空的查詢對象,則會刪除集合中的所有文檔:
#刪除集合中所有文檔 x = mycol.delete_many({}) #mycol = mydb["sites"]連的是sites,所以會刪除sites里的所有文檔 print(x.deleted_count, "個文檔已刪除")
刪除后:
4.刪除集合
我們可以使用 drop() 方法來刪除一個集合。
#刪除集合 mycol.drop()
總代碼有:
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") #新建數(shù)據(jù)庫 mydb = myclient["runoobdbs"] #創(chuàng)建集合 mycol = mydb["sites"] ''' #判斷數(shù)據(jù)庫是否存在 dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫名 # dblist = myclient.database_names() if "runoobdbs" in dblist: print("數(shù)據(jù)庫已存在!") #判斷集合是否存在 collist = mydb. list_collection_names() #獲取集合名 # collist = mydb.collection_names() if "sites" in collist: # 判斷 sites 集合是否存在 print("集合已存在!") ''' #插入文檔 #mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"} #x = mycol.insert_one(mydict) #print(x) #print(x.inserted_id) #插入多個文檔 #mylist = [ # {"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com"}, # {"name": "QQ", "alexa": "101", "url": "https://www.qq.com"}, # {"name": "Facebook", "alexa": "10", "url": "https://www.facebook.com"}, # {"name": "知乎", "alexa": "103", "url": "https://www.zhihu.com"}, # {"name": "Github", "alexa": "109", "url": "https://www.github.com"} #] #x = mycol.insert_many(mylist) # 輸出插入的所有文檔對應的 _id 值 #print(x.inserted_ids) #插入多條不同id的文檔 #mycol2 = mydb["site2"] #mylist2 = [ # {"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥教程"}, # {"_id": 2, "name": "Google", "address": "Google 搜索"}, # {"_id": 3, "name": "Facebook", "address": "臉書"}, # {"_id": 4, "name": "Taobao", "address": "淘寶"}, # {"_id": 5, "name": "Zhihu", "address": "知乎"} #] #x = mycol2.insert_many(mylist2) # 輸出插入的所有文檔對應的 _id 值 #print(x.inserted_ids) #查詢一條數(shù)據(jù) #x = mycol.find_one() #print(x) #查詢所有數(shù)據(jù) #for x in mycol.find(): # print(x) #返回指定字段 #for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }): #意思是只返回name和alexa,不要id # print(x) #for x in mycol.find({},{ "alexa": 0 }): #除了alexa字段,其他都返回 # print(x) #根據(jù)指定條件查詢 #myquery = {"name": "RUNOOB"} #mydoc = mycol.find(myquery) #for x in mydoc: # print(x) #高級查詢 #myquery = { "name": { "$gt": "H" }} #mydoc = mycol.find(myquery) #for x in mydoc: # print(x) #使用正則表達式查詢 #myquery = {"name": {"$regex": "^R"}} #mydoc = mycol.find(myquery) #for x in mydoc: # print(x) #返回指定條數(shù) #myresult = mycol.find().limit(3) # 輸出結果 #for x in myresult: # print(x) #修改一條數(shù)據(jù) #myquery = {"alexa": "10000"} #將alexa的10000的數(shù)據(jù)值改為12345 #newvalues = {"$set": {"alexa": "12345"}} #mycol.update_one(myquery, newvalues) # 輸出修改后的 "sites" 集合 #for x in mycol.find(): # print(x) #修改多條數(shù)據(jù) #myquery = {"name": {"$regex": "^F"}} #尋找以F開頭的name,將其alexa值改為123 #newvalues = {"$set": {"alexa": "123"}} #x = mycol.update_many(myquery, newvalues) #print(x.modified_count, "文檔已修改") #排序 將alexa以升序排序 #mydoc = mycol.find().sort("alexa") #for x in mydoc: # print(x) #alexa降序 #mydoc = mycol.find().sort("alexa", -1) #for x in mydoc: # print(x) #刪除一條數(shù)據(jù) #myquery = {"name": "Taobao"} #mycol.delete_one(myquery) # 刪除后輸出 #for x in mycol.find(): # print(x) #刪除多條數(shù)據(jù) #myquery = {"name": {"$regex": "^F"}} #x = mycol.delete_many(myquery) #print(x.deleted_count, "個文檔已刪除") #刪除集合中所有文檔 #x = mycol.delete_many({}) #print(x.deleted_count, "個文檔已刪除") #刪除集合 mycol.drop()
總結
到此這篇關于Python如何使用pymongo連接MongoDB數(shù)據(jù)庫并進行相關操作的文章就介紹到這了,更多相關pymongo連接MongoDB數(shù)據(jù)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫的實例
今天小編就為大家分享一篇Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python 批量驗證和添加手機號碼為企業(yè)微信聯(lián)系人
你是否也有過需要添加很多微信好友的時候,一個個輸入添加太麻煩了,本篇文章手把手教你用Python替我們完成這繁瑣的操作,大家可以在過程中查缺補漏,看看自己掌握程度怎么樣2021-10-10