吳裕雄--天生天然python學習筆記:Python MongoDB

MongoDB 是目前最流行的 NoSQL 數據庫之一,使用的數據類型 BSON(相似 JSON)。
PyMongo
Python 要鏈接 MongoDB 須要 MongoDB 驅動,這裏咱們使用 PyMongo 驅動來鏈接。

pip 安裝
pip 是一個通用的 Python 包管理工具,提供了對 Python 包的查找、下載、安裝、卸載的功能。

安裝 pymongo:

$ python3 -m pip3 install pymongo
也能夠指定安裝的版本:

$ python3 -m pip3 install pymongo==3.5.1
更新 pymongo 命令:

$ python3 -m pip3 install --upgrade pymongo
easy_install 安裝
舊版的 Python 可使用 easy_install 來安裝,easy_install 也是 Python 包管理工具。

$ python -m easy_install pymongo
更新 pymongo 命令:

$ python -m easy_install -U pymongo
測試 PyMongo
接下來咱們能夠建立一個測試文件 demo_test_mongodb.py,代碼以下:

demo_test_mongodb.py 文件代碼:
#!/usr/bin/python3
 
import pymongo
執行以上代碼文件,若是沒有出現錯誤,表示安裝成功。
建立數據庫
建立一個數據庫
建立數據庫須要使用 MongoClient 對象,而且指定鏈接的 URL 地址和要建立的數據庫名。

以下實例中,咱們建立的數據庫 runoobdb :

實例
#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
注意: 在 MongoDB 中,數據庫只有在內容插入後纔會建立! 就是說,數據庫建立後要建立集合(數據表)並插入一個文檔(記錄),數據庫纔會真正建立。
判斷數據庫是否已存在
咱們能夠讀取 MongoDB 中的全部數據庫,並判斷指定的數據庫是否存在:

實例
#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
 
dblist = myclient.list_database_names()
# dblist = myclient.database_names() 
if "runoobdb" in dblist:
  print("數據庫已存在!")
注意:database_names 在最新版本的 Python 中已廢棄,Python3.7+ 以後的版本改成了 list_database_names()。
建立集合
MongoDB 中的集合相似 SQL 的表。

建立一個集合
MongoDB 使用數據庫對象來建立集合,實例以下:

實例
#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
 
mycol = mydb["sites"]
注意: 在 MongoDB 中,集合只有在內容插入後纔會建立! 就是說,建立集合(數據表)後要再插入一個文檔(記錄),集合纔會真正建立。
判斷集合是否已存在
咱們能夠讀取 MongoDB 數據庫中的全部集合,並判斷指定的集合是否存在:

實例
#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
 
mydb = myclient['runoobdb']
 
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if "sites" in collist:   # 判斷 sites 集合是否存在
  print("集合已存在!")
注意:collection_names 在最新版本的 Python 中已廢棄,Python3.7+ 以後的版本改成了 list_collection_names()。
增、刪、改、查等操做
Python Mongodb 插入文檔
MongoDB 中的一個文檔相似 SQL 表中的一條記錄。
插入集合
集合中插入文檔使用 insert_one() 方法,該方法的第一參數是字典 name => value 對。

如下實例向 sites 集合中插入文檔:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }
 
x = mycol.insert_one(mydict) 
print(x)
print(x)
執行輸出結果爲:

<pymongo.results.InsertOneResult object at 0x10a34b288>
返回 _id 字段
insert_one() 方法返回 InsertOneResult 對象,該對象包含 inserted_id 屬性,它是插入文檔的 id 值。
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['runoobdb']
mycol = mydb["sites"]
 
mydict = { "name": "Google", "alexa": "1", "url": "https://www.google.com" }
 
x = mycol.insert_one(mydict)
 
print(x.inserted_id)
執行輸出結果爲:

5b2369cac315325f3698a1cf
若是咱們在插入文檔時沒有指定 _id,MongoDB 會爲每一個文檔添加一個惟一的 id。
插入多個文檔
集合中插入多個文檔使用 insert_many() 方法,該方法的第一參數是字典列表。
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
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)
輸出結果相似以下:

[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]
insert_many() 方法返回 InsertManyResult 對象,該對象包含 inserted_ids 屬性,該屬性保存着全部插入文檔的 id 值。

執行完以上查找,咱們能夠在命令終端,查看數據是否已插入:

 

 

插入指定 _id 的多個文檔
咱們也能夠本身指定 id,插入,如下實例咱們在 site2 集合中插入數據,_id 爲咱們指定的:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["site2"]
 
mylist = [
  { "_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 = mycol.insert_many(mylist)
 
# 輸出插入的全部文檔對應的 _id 值
print(x.inserted_ids)
輸出結果爲:

[1, 2, 3, 4, 5]

 

Python Mongodb 查詢文檔
MongoDB 中使用了 find 和 find_one 方法來查詢集合中的數據,它相似於 SQL 中的 SELECT 語句。

本文使用的測試數據以下:

 

 

查詢一條數據
咱們可使用 find_one() 方法來查詢集合中的一條數據。

查詢 sites 文檔中的第一條數據:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
x = mycol.find_one()
 
print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
查詢集合中全部數據
find() 方法能夠查詢集合中的全部數據,相似 SQL 中的 SELECT * 操做。

如下實例查找 sites 集合中的全部數據:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
for x in mycol.find():
  print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
查詢指定字段的數據
咱們可使用 find() 方法來查詢指定字段的數據,將要返回的字段對應值設置爲 1import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
  print(x)
輸出結果爲:

{'name': 'RUNOOB', 'alexa': '10000'}
{'name': 'Google', 'alexa': '1'}
{'name': 'Taobao', 'alexa': '100'}
{'name': 'QQ', 'alexa': '101'}
{'name': 'Facebook', 'alexa': '10'}
{'name': '知乎', 'alexa': '103'}
{'name': 'Github', 'alexa': '109'}
除了 _id 你不能在一個對象中同時指定 0 和 1,若是你設置了一個字段爲 0,則其餘都爲 1,反之亦然。
如下實例除了 alexa 字段外,其餘都返回:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
for x in mycol.find({},{ "alexa": 0 }):
  print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'url': 'https://www.github.com'}
如下代碼同時指定了 0 和 1 則會報錯:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
for x in mycol.find({},{ "name": 1, "alexa": 0 }):
  print(x)
錯誤內容大概以下:

...
pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.
...
根據指定條件查詢
咱們能夠在 find() 中設置參數來過濾數據。

如下實例查找 name 字段爲 "RUNOOB" 的數據:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "name": "RUNOOB" }
 
mydoc = mycol.find(myquery)
 
for x in mydoc:
  print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
高級查詢
查詢的條件語句中,咱們還可使用修飾符。

如下實例用於讀取 name 字段中第一個字母 ASCII 值大於 "H" 的數據,大於的修飾符條件爲 {"$gt": "H"} :
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "name": { "$gt": "H" } }
 
mydoc = mycol.find(myquery)
 
for x in mydoc:
  print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
使用正則表達式查詢
咱們還可使用正則表達式做爲修飾符。

正則表達式修飾符只用於搜索字符串的字段。

如下實例用於讀取 name 字段中第一個字母爲 "R" 的數據,正則表達式修飾符條件爲 {"$regex": "^R"} :
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "name": { "$regex": "^R" } }
 
mydoc = mycol.find(myquery)
 
for x in mydoc:
  print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
返回指定條數記錄
若是咱們要對查詢結果設置指定條數的記錄可使用 limit() 方法,該方法只接受一個數字參數。

如下實例返回 3 條文檔記錄:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myresult = mycol.find().limit(3)
 
# 輸出結果
for x in myresult:
  print(x)
輸出結果爲:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
Python Mongodb 修改文檔
咱們能夠在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個參數爲查詢的條件,第二個參數爲要修改的字段。

若是查找到的匹配數據多餘一條,則只會修改第一條。
如下實例將 alexa 字段的值 10000 改成 12345:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "alexa": "10000" }
newvalues = { "$set": { "alexa": "12345" } }
 
mycol.update_one(myquery, newvalues)
 
# 輸出修改後的  "sites"  集合
for x in mycol.find():
  print(x)

 

 

update_one() 方法只能修匹配到的第一條記錄,若是要修改全部匹配到的記錄,可使用 update_many()。

如下實例將查找全部以 F 開頭的 name 字段,並將匹配到全部記錄的 alexa 字段修改成 123import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } }
 
x = mycol.update_many(myquery, newvalues)
 
print(x.modified_count, "文檔已修改")
輸出結果爲:

1 文檔已修改
查看數據是否已修改:

 

 

排序
sort() 方法能夠指定升序或降序排序。

sort() 方法第一個參數爲要排序的字段,第二個字段指定排序規則,1 爲升序,-1 爲降序,默認爲升序。
對字段 alexa 按升序排序:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mydoc = mycol.find().sort("alexa")
for x in mydoc:
  print(x)

 

 

對字段 alexa 按降序排序:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mydoc = mycol.find().sort("alexa", -1)
 
for x in mydoc:
  print(x)

 

 

Python Mongodb 刪除數據
咱們可使用 delete_one() 方法來刪除一個文檔,該方法第一個參數爲查詢對象,指定要刪除哪些數據。
如下實例刪除 name 字段值爲 "Taobao" 的文檔:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "name": "Taobao" }
 
mycol.delete_one(myquery)
 
# 刪除後輸出
for x in mycol.find():
  print(x)
輸出結果爲:

 

 

刪除多個文檔
咱們可使用 delete_many() 方法來刪除多個文檔,該方法第一個參數爲查詢對象,指定要刪除哪些數據。

刪除全部 name 字段中以 F 開頭的文檔:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
myquery = { "name": {"$regex": "^F"} }
 
x = mycol.delete_many(myquery)
 
print(x.deleted_count, "個文檔已刪除")
刪除集合中的全部文檔
delete_many() 方法若是傳入的是一個空的查詢對象,則會刪除集合中的全部文檔:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
x = mycol.delete_many({})
 
print(x.deleted_count, "個文檔已刪除")
刪除集合
咱們可使用 drop() 方法來刪除一個集合。
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mycol.drop()
若是刪除成功 drop() 返回 true,若是刪除失敗(集合不存在)則返回 false。

咱們使用如下命令在終端查看集合是否已刪除:

> use runoobdb
switched to db runoobdb
> show tables;
相關文章
相關標籤/搜索