Python如何使用pymongo連接MongoDB數(shù)據(jù)庫(kù)并進(jìn)行相關(guān)操作
一、基本概述
目前電腦上已經(jīng)下載了MongoDB數(shù)據(jù)庫(kù)、navicat for mongodb作為mongoDB的可視化工具,形如navicat for mysql作為mysql的可視化工具。
使用Pycharm編寫python代碼連接mongodb,創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建集合(集合是指形如mysql中的sql數(shù)據(jù)表)等操作。
使用pymongo進(jìn)行數(shù)據(jù)庫(kù)連接,因此需要在pycharm中下載。
二、創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù)需要使用 MongoClient 對(duì)象,并且指定連接的 URL 地址和要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)名。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建數(shù)據(jù)庫(kù)
mydb = myclient["runoobdbs"]注意:
此時(shí)navicat還無(wú)法看見(jiàn)新建的數(shù)據(jù)庫(kù),這是因?yàn)樵?MongoDB 中,數(shù)據(jù)庫(kù)只有在內(nèi)容插入后才會(huì)創(chuàng)建!
就是說(shuō),數(shù)據(jù)庫(kù)創(chuàng)建后要?jiǎng)?chuàng)建集合(數(shù)據(jù)表)并插入一個(gè)文檔(記錄),數(shù)據(jù)庫(kù)才會(huì)真正創(chuàng)建。
三、判斷數(shù)據(jù)庫(kù)是否存在
代碼如下:
#判斷數(shù)據(jù)庫(kù)是否存在
dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫(kù)名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("數(shù)據(jù)庫(kù)已存在!")四、創(chuàng)建集合
代碼如下:
#創(chuàng)建集合 mycol = mydb["sites"]
五、判斷集合是否存在
代碼如下:
#判斷集合是否存在
collist = mydb. list_collection_names() #獲取集合名
# collist = mydb.collection_names()
if "sites" in collist: # 判斷 sites 集合是否存在
print("集合已存在!")此時(shí)仍舊無(wú)法顯示數(shù)據(jù)庫(kù)和集合名。
六、插入文檔
1.插入單個(gè)文檔
文檔就是指的里面的數(shù)據(jù)。
#插入文檔
mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"}
x = mycol.insert_one(mydict)
print(x)若是沒(méi)有數(shù)據(jù)庫(kù)、集合在,此代碼上面要有創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建集合的代碼。
代碼運(yùn)行前MongoDB顯示數(shù)據(jù)庫(kù)名稱:

代碼運(yùn)行后MongoDB顯示數(shù)據(jù)庫(kù)名稱:

運(yùn)行后navicat fo rmongodb顯示如下:

Pycharm運(yùn)行第一次結(jié)果:

第二次運(yùn)行結(jié)果:

此時(shí)全部代碼有:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建數(shù)據(jù)庫(kù)
mydb = myclient["runoobdbs"]
#判斷數(shù)據(jù)庫(kù)是否存在
dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫(kù)名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("數(shù)據(jù)庫(kù)已存在!")
#創(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 對(duì)象,該對(duì)象包含 inserted_id 屬性,它是插入文檔的 id 值。
返回 _id 字段只需要在以上代碼最后下再加一句print(x.inserted_id)即可。
結(jié)果是:

而此時(shí)由于運(yùn)行了三次,出現(xiàn)了三行內(nèi)容一樣,id不一樣的文檔。

3.插入多個(gè)文檔
集合中插入多個(gè)文檔使用 insert_many() 方法,該方法的第一參數(shù)是字典列表。
代碼如下:
#插入多個(gè)文檔
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)
# 輸出插入的所有文檔對(duì)應(yīng)的 _id 值
print(x.inserted_ids)Pycharm運(yùn)行結(jié)果:

navicat顯示如下:

也可以使用MongoDB查看。

補(bǔ)充:
use+空格+數(shù)據(jù)庫(kù),作用是數(shù)據(jù)庫(kù)不在時(shí)新建,在時(shí)切換到此數(shù)據(jù)庫(kù)下。db.creatCollection('集合名'),創(chuàng)建集合。db.集合名.find()方法顯示此集合下所有數(shù)據(jù)。
4.插入指定 _id 的多個(gè)文檔
我們也可以自己指定 id,插入,以下實(shí)例我們?cè)?site2 集合中插入數(shù)據(jù),_id 為我們指定的:
mycol2 = mydb["site2"]
mylist2 = [
{"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥(niǎo)教程"},
{"_id": 2, "name": "Google", "address": "Google 搜索"},
{"_id": 3, "name": "Facebook", "address": "臉書(shū)"},
{"_id": 4, "name": "Taobao", "address": "淘寶"},
{"_id": 5, "name": "Zhihu", "address": "知乎"}
]
x = mycol2.insert_many(mylist2)
# 輸出插入的所有文檔對(duì)應(yīng)的 _id 值
print(x.inserted_ids)Pycharm運(yùn)行結(jié)果:

navicat顯示如下:

此時(shí)全部代碼如下:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建數(shù)據(jù)庫(kù)
mydb = myclient["runoobdbs"]
#創(chuàng)建集合
mycol = mydb["sites"]
'''
#判斷數(shù)據(jù)庫(kù)是否存在
dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫(kù)名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("數(shù)據(jù)庫(kù)已存在!")
#判斷集合是否存在
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)
#插入多個(gè)文檔
#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)
# 輸出插入的所有文檔對(duì)應(yīng)的 _id 值
#print(x.inserted_ids)
#插入多條不同id的文檔
mycol2 = mydb["site2"]
mylist2 = [
{"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥(niǎo)教程"},
{"_id": 2, "name": "Google", "address": "Google 搜索"},
{"_id": 3, "name": "Facebook", "address": "臉書(shū)"},
{"_id": 4, "name": "Taobao", "address": "淘寶"},
{"_id": 5, "name": "Zhihu", "address": "知乎"}
]
x = mycol2.insert_many(mylist2)
# 輸出插入的所有文檔對(duì)應(yīng)的 _id 值
print(x.inserted_ids)
七、查詢文檔
本節(jié)上個(gè)內(nèi)容有顯示MongoDB查詢文檔的操作,在Pycharm里如何實(shí)現(xiàn)查詢呢?
1.查詢一條數(shù)據(jù)
#查詢一條數(shù)據(jù) x = mycol.find_one() print(x)
Pycharm運(yùn)行結(jié)果:

2.查詢集合中所有數(shù)據(jù)
find() 方法可以查詢集合中的所有數(shù)據(jù),類似 SQL 中的 SELECT * 操作。
#查詢所有數(shù)據(jù) for x in mycol.find(): print(x)
Pycharm運(yùn)行結(jié)果:

3.查詢指定字段的數(shù)據(jù)
我們可以使用 find() 方法來(lái)查詢指定字段的數(shù)據(jù),將要返回的字段對(duì)應(yīng)值設(shè)置為 1。
除了 _id,你不能在一個(gè)對(duì)象中同時(shí)指定 0 和 1,如果你設(shè)置了一個(gè)字段為 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)運(yùn)行結(jié)果是:


4.根據(jù)指定條件查詢
我們可以在 find() 中設(shè)置參數(shù)來(lái)過(guò)濾數(shù)據(jù)。
#根據(jù)指定條件查詢
myquery = {"name": "RUNOOB"}
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)運(yùn)行結(jié)果:

5.高級(jí)查詢
查詢的條件語(yǔ)句中,我們還可以使用修飾符。
以下實(shí)例用于讀取 name 字段中第一個(gè)字母 ASCII 值大于 “H” 的數(shù)據(jù),大于的修飾符條件為 {“$gt”: “H”} :
#高級(jí)查詢
myquery = { "name": { "$gt": "H" }}
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)運(yùn)行結(jié)果:

MongoDB中條件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
6.使用正則表達(dá)式查詢
我們還可以使用正則表達(dá)式作為修飾符。
正則表達(dá)式修飾符只用于搜索字符串的字段。
以下實(shí)例用于讀取 name 字段中第一個(gè)字母為 “R” 的數(shù)據(jù),正則表達(dá)式修飾符條件為 {“$regex”: “^R”} :
$regex為模糊查詢的字符串提供正則表達(dá)式功能。
#使用正則表達(dá)式查詢
myquery = {"name": {"$regex": "^R"}} #查詢name中以R開(kāi)頭的數(shù)據(jù)
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)運(yùn)行結(jié)果:

7.返回指定條數(shù)記錄
如果我們要對(duì)查詢結(jié)果設(shè)置指定條數(shù)的記錄可以使用 limit() 方法,該方法只接受一個(gè)數(shù)字參數(shù)。
以下實(shí)例返回 3 條文檔記錄:
#返回指定條數(shù) myresult = mycol.find().limit(3) #查詢前三條數(shù)據(jù) # 輸出結(jié)果 for x in myresult: print(x)

八、修改文檔
在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個(gè)參數(shù)為查詢的條件,第二個(gè)參數(shù)為要修改的字段。
如果查找到的匹配數(shù)據(jù)多于一條,則只會(huì)修改第一條。
更新前的數(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()。
以下實(shí)例將查找所有以 F 開(kāi)頭的 name 字段,并將匹配到所有記錄的 alexa 字段修改為 123:
#修改多條數(shù)據(jù)
myquery = {"name": {"$regex": "^F"}} #尋找以F開(kāi)頭的name,將其alexa值改為123
newvalues = {"$set": {"alexa": "123"}}
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文檔已修改")更新后:

九、排序
sort() 方法可以指定升序或降序排序。
sort() 方法第一個(gè)參數(shù)為要排序的字段,第二個(gè)字段指定排序規(guī)則,1 為升序,-1 為降序,默認(rèn)為升序。
#排序 將alexa以升序排序
mydoc = mycol.find().sort("alexa")
for x in mydoc:
print(x)結(jié)果如下:

降序排序:
#alexa降序
mydoc = mycol.find().sort("alexa", -1)
for x in mydoc:
print(x)結(jié)果如下:

十、刪除文檔
1.刪除一個(gè)文檔
使用 delete_one() 方法來(lái)刪除一個(gè)文檔,該方法第一個(gè)參數(shù)為查詢對(duì)象,指定要?jiǎng)h除哪些數(shù)據(jù)。
刪除前的數(shù)據(jù)庫(kù)如圖:

#刪除一條數(shù)據(jù)
myquery = { "name": "Taobao" }
mycol.delete_one(myquery)
# 刪除后輸出
for x in mycol.find():
print(x)刪除后:

2.刪除多個(gè)文檔
我們可以使用 delete_many() 方法來(lái)刪除多個(gè)文檔,該方法第一個(gè)參數(shù)為查詢對(duì)象,指定要?jiǎng)h除哪些數(shù)據(jù)。
刪除所有 name 字段中以 F 開(kāi)頭的文檔:
#刪除多條數(shù)據(jù)
myquery = {"name": {"$regex": "^F"}}
x = mycol.delete_many(myquery)
print(x.deleted_count, "個(gè)文檔已刪除")刪除后:

3.刪除集合中的所有文檔
delete_many() 方法如果傳入的是一個(gè)空的查詢對(duì)象,則會(huì)刪除集合中的所有文檔:
#刪除集合中所有文檔
x = mycol.delete_many({}) #mycol = mydb["sites"]連的是sites,所以會(huì)刪除sites里的所有文檔
print(x.deleted_count, "個(gè)文檔已刪除")刪除后:

4.刪除集合
我們可以使用 drop() 方法來(lái)刪除一個(gè)集合。
#刪除集合 mycol.drop()

總代碼有:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建數(shù)據(jù)庫(kù)
mydb = myclient["runoobdbs"]
#創(chuàng)建集合
mycol = mydb["sites"]
'''
#判斷數(shù)據(jù)庫(kù)是否存在
dblist = myclient.list_database_names() #list_database_names()獲取數(shù)據(jù)庫(kù)名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("數(shù)據(jù)庫(kù)已存在!")
#判斷集合是否存在
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)
#插入多個(gè)文檔
#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)
# 輸出插入的所有文檔對(duì)應(yīng)的 _id 值
#print(x.inserted_ids)
#插入多條不同id的文檔
#mycol2 = mydb["site2"]
#mylist2 = [
# {"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥(niǎo)教程"},
# {"_id": 2, "name": "Google", "address": "Google 搜索"},
# {"_id": 3, "name": "Facebook", "address": "臉書(shū)"},
# {"_id": 4, "name": "Taobao", "address": "淘寶"},
# {"_id": 5, "name": "Zhihu", "address": "知乎"}
#]
#x = mycol2.insert_many(mylist2)
# 輸出插入的所有文檔對(duì)應(yīng)的 _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)
#高級(jí)查詢
#myquery = { "name": { "$gt": "H" }}
#mydoc = mycol.find(myquery)
#for x in mydoc:
# print(x)
#使用正則表達(dá)式查詢
#myquery = {"name": {"$regex": "^R"}}
#mydoc = mycol.find(myquery)
#for x in mydoc:
# print(x)
#返回指定條數(shù)
#myresult = mycol.find().limit(3)
# 輸出結(jié)果
#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開(kāi)頭的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, "個(gè)文檔已刪除")
#刪除集合中所有文檔
#x = mycol.delete_many({})
#print(x.deleted_count, "個(gè)文檔已刪除")
#刪除集合
mycol.drop()總結(jié)
到此這篇關(guān)于Python如何使用pymongo連接MongoDB數(shù)據(jù)庫(kù)并進(jìn)行相關(guān)操作的文章就介紹到這了,更多相關(guān)pymongo連接MongoDB數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問(wèn)題
這篇文章主要介紹了解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫(kù)的實(shí)例
今天小編就為大家分享一篇Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫(kù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
golang/python實(shí)現(xiàn)歸并排序?qū)嵗a
這篇文章主要給大家介紹了關(guān)于golang/python實(shí)現(xiàn)歸并排序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python遍歷pandas數(shù)據(jù)方法總結(jié)
本篇文章給大家詳細(xì)介紹了Python中遍歷pandas數(shù)據(jù)方法以及相關(guān)注意點(diǎn),對(duì)此有興趣的朋友參考學(xué)習(xí)下吧。2018-02-02
python二分查找算法的遞歸實(shí)現(xiàn)方法
這篇文章主要介紹了python二分查找算法的遞歸實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python二分查找算法的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-05-05
在Python的Django框架上部署ORM庫(kù)的教程
這篇文章主要介紹了在Python的Django框架上部署ORM庫(kù)的教程,文中還給出了幾個(gè)ORM庫(kù)之間的對(duì)比,需要的朋友可以參考下2015-04-04
Python 批量驗(yàn)證和添加手機(jī)號(hào)碼為企業(yè)微信聯(lián)系人
你是否也有過(guò)需要添加很多微信好友的時(shí)候,一個(gè)個(gè)輸入添加太麻煩了,本篇文章手把手教你用Python替我們完成這繁瑣的操作,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10

