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() 方法來查詢指定字段的數據,將要返回的字段對應值設置爲 1。 import 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 字段修改成 123: import 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;