ongoDB超全語法大全
python 模塊pymongo模塊,連接MongoDB數據庫
python模塊之 Motor 異步pymongo
MongoDB:https://www.mongodb.com/try/download/community
MongoDB shell腳本:https://www.mongodb.com/try/download/shell,下載后解壓到MongoDB安裝目錄
參數 | 說明 |
--quiet | # 安靜輸出 |
--port arg | # 指定服務端口號,默認端口27017 |
--bind_ip arg | # 綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地所有IP |
--logpath arg | # 指定MongoDB日志文件,注意是指定文件不是目錄 |
--logappend | # 使用追加的方式寫日志 |
--pidfilepath arg | # PID File 的完整路徑,如果沒有設置,則沒有PID文件 |
--keyFile arg | # 集群的私鑰的完整路徑,只對于Replica Set 架構有效 |
--unixSocketPrefix arg | # UNIX域套接字替代目錄,(默認為 /tmp) |
--fork | # 以守護進程的方式運行MongoDB,創建服務器進程 |
--auth | # 啟用驗證 |
--cpu | # 定期顯示CPU的CPU利用率和iowait |
--dbpath arg | # 指定數據庫路徑 |
--diaglog arg | # diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads |
--directoryperdb | # 設置每個數據庫將被保存在一個單獨的目錄 |
--journal | # 啟用日志選項,MongoDB的數據操作將會寫入到journal文件夾的文件里 |
--journalOptions arg | # 啟用日志診斷選項 |
--ipv6 | # 啟用IPv6選項 |
--jsonp | # 允許JSONP形式通過HTTP訪問(有安全影響) |
--maxConns arg | # 最大同時連接數 默認2000 |
--noauth | # 不啟用驗證 |
--nohttpinterface | # 關閉http接口,默認關閉27018端口訪問 |
--noprealloc | # 禁用數據文件預分配(往往影響性能) |
--noscripting | # 禁用腳本引擎 |
--notablescan | # 不允許表掃描 |
--nounixsocket | # 禁用Unix套接字監聽 |
--nssize arg (=16) | # 設置信數據庫.ns文件大小(MB) |
--objcheck | # 在收到客戶數據,檢查的有效性, |
--profile arg | # 檔案參數 0=off 1=slow, 2=all |
--quota | # 限制每個數據庫的文件數,設置默認為8 |
--quotaFiles arg | # number of files allower per db, requires --quota |
--rest | # 開啟簡單的rest API |
--repair | # 修復所有數據庫run repair on all dbs |
--repairpath arg | # 修復庫生成的文件的目錄,默認為目錄名稱dbpath |
--slowms arg (=100) | # value of slow for profile and console log |
--smallfiles | # 使用較小的默認文件 |
--syncdelay arg (=60) | # 數據寫入磁盤的時間秒數(0=never,不推薦) |
--sysinfo | # 打印一些診斷系統信息 |
--upgrade | # 如果需要升級數據庫 |
#數據庫數據存放目錄 dbpath=D:\MongoDB\data\db #數據庫日志存放目錄 logpath=D:\MongoDB\data\log\mongo.log #以追加的方式記錄日志 logappend = true #端口號 默認為 27017 port=27017 #開啟用戶認證 auth=false #mongodb所綁定的ip地址,綁定后只能通過127訪問 bind_ip = 0.0.0.0 #啟用日志,默認啟用 journal=true #過濾掉一些無用的日志信息,若需要調試使用請設置為false quiet=true #不允許全表掃描 notablescan=false
我們在上一文中,介紹了關系型數據庫的相關使用,本文接著來介紹另一重要的數據庫類型,非關系型數據庫(NoSQL)。NoSQL 是基于鍵值對的存儲方式,不需要經過 SQL 層的解析,數據之間也沒有耦合性,因此其性能非常高。常見的非關系型數據庫有 MongoDB,Neo4J,HBase,Redis 等,本文使用常用的 MongoDB 來講解非關系型數據庫的使用。
MongoDB 是由 C++編寫而成,是一個基于分布式文件存儲的開源數據庫系統,其存儲形式類似于 json 對象,因此在使用時非常靈活,被廣泛使用。
MongoDB圖標
Python 使用 MongoDB 數據庫需要第三方庫來支持,因此需要先安裝 pymongo 庫。
pip install pymongo
快速上手
import pymongo
# 建立連接
client = pymongo.MongoClient(host="localhost", port=27017)
# 引用數據庫名稱,這里假設要創建名為mydatabase的數據庫
db = client['mydatabase']
# 要驗證數據庫是否已存在,可以列出所有數據庫名稱
print(client.list_database_names())
# 若要進一步操作,比如創建集合并插入數據
collection_name = 'mycollection'
data = {'name': 'example document'}
# 新增數據
db[collection_name].insert_one(data)
非關系型數據庫和關系型數據庫在概念上存在一定差異,如下表:
MongoDB與關系型數據庫對照
指定使用的數據庫(database)
一般在應用中會存在多個數據庫,并且在操作數據的時候需要指定是哪個具體的數據庫,如下:
# 下方client為建立連接后的client對象
# 使用屬性的方式
db = client['mydatabase']
# 使用點模式
db = client.mydatabase
這里我們選擇了“mydatabase”這個數據庫,需要注意的是,如果這個數據庫不存在,后續在執行數據插入的時候會自動創建該庫(非常給力的一個功能)。
指定集合
在 MongoDB 的一個數據庫中,可以包含多個 collection(集合, 可以類比為 MySQL 中的表),因此在操作數據的時候還需要指定集合。我們只需要使用上邊獲取的數據并使用屬性就可以獲取到指定集合。
# 下邊db指獲取到的庫
# 屬性獲取
collection = db['mycollection']
# 點模式獲取
collection = db.mycollection
新增數據
在獲取到數據后就可以使用 insert* 方法來新增數據了。
collection.insert_one(
{'name': 'example document',
'age': 18,
'address': 'beijing',
'phone': '1234567890'})
新增的數據
如上圖所示使用 insert_one 方法新增一條數據。
還可以使用 insert_many 來同時新增多條數據
collection.insert_many(
[{'name': 'example1', 'age': 18, 'address': 'beijing'}
,{'name': 'example2', 'age': 18, 'address': 'beijing'}])
從上邊運行結果可以看出, MongoDB 在新增數據時,只需要新增即可,數據庫會自動設置一個 _id 屬性來表示主鍵。此 _id 值由 MongoDB 來維護。并且新增成功后,方法會返回一個InsertOneResult 對象,其中包含了數據 _id 值,需要注意的是,這里的_id是ObjectId對象。
數據存入后,最重要的就是要根據合適的條件取出來,此時可以使用 find*方法來獲取已經存入的數據,當然,pymongo 中提供了更多的方法來支持這些功能,如下。
find可用的方法
find_one 查找一條結果
# 獲取一條數據,其中name為"example document"
res = collection.find_one({"name": "example document"})
print(res)
# {'_id': ObjectId('65a8c06271f39c34e5e98579'), 'name': 'example document'}
print(type(res))
# <class 'dict'>
如上述代碼中,我們使用 find_one 查找一條 name 為"example document"的內容,并返回一個 dict,如果沒有匹配的條件則返回 None。
需要特別注意的是,如果使用數據主鍵 _id 查詢,需要使用 ObjectId 構建 id 值,直接使用字符串查找會無法查詢到結果。
# 需要使用ObjectId構建id
res = collection.find_one({"_id": ObjectId("65a8c06271f39c34e5e98579")})
find 查找多條
res = collection.find({'name': 'example document'})
print(res)
for row in res:
print(row)
# <pymongo.cursor.Cursor object at 0x000001DCE4578E90>
# {'_id': ObjectId('65a8c06271f39c34e5e98579'), 'name': 'example document'}
# {'_id': ObjectId('65a8c098a6c8916e18ee8e80'), 'name': 'example document'}
使用 find 方法將會查找出所有符合條件的數據,并封裝到了 Cursor 對象中,因此需要遍歷當前對象才可以獲取到每條數據。MongoDB提供了非常豐富的條件查詢,以下是一些常用示例:
MongoDB 條件查找
res = collection.find({'age': {'$gt': 20}})
如上代碼中, 查找 age 大于 20 的數據,需要注意的是,條件是一個對象的結構。
計數
早先的版本中可以使用 find 返回的結果使用 count 方法來計數, 但是這個方法在后續版本中被廢棄了, 現在需要使用 count_documents 來統計條件下的查詢的數量。
count = collection.count_documents({})
print("count:", count) #10
排序
與關系型數據庫相似的, MongoDB 也支持排序,find 結果后調用 sort,并指定排序方式即可完成結果排序
# ASCENDING = 1
# """Ascending sort order."""
# DESCENDING = -1
# """Descending sort order."""
res = collection.find()
rows = res.sort("name", pymongo.ASCENDING)
排序參數可以使用pymongo 中定義的常量,也可以直接賦值 1 或-1。
偏移
熟悉后臺開發的一定使用過分頁, 在 MongoDB 中也支持這樣的操作, 但是需要搭配 skip 和 limit 兩個方法來完成
res = collection.find()
row = res.skip(2).limit(2)
如上所示,使用 skip 跳過前兩條, 使用 limit 方法獲取結果中的 2 條數據, 結果中最終會返回第 3,4 條數據。不過需要注意的是,這樣的查找在數據量較大的情況下需要慎用,可能會導致內存不足,一般的解決方式是記錄上一次查詢最后一條數據的 id,然后查找此大于此 id 值的,再進行 limit 限制。
更新數據時,需要使用 update 方法來完成。
collection.update_one({'name': 'example document'},
{"$set": {"name": "測試數據", "age": 30}})
如上述代碼中,update_one 接受兩個參數, 第一個參數為查詢條件, 第二個參數為需要設置的內容。
在上方數據查詢中有find_one_and_update 方法也可以在完成更新的操作
clt.find_one_and_update({'name': 'example document'},
{"$set": {"name": "測試數據2", "age": 30}})
兩者執行本質是一樣的,都是先查詢,后更新。
刪除數據時,需要使用 delete_one 方法來完成,返回DeleteResult 結果中包含了操作成功的條數,如果操作不成功則返回 None。
res = clt.delete_one({'name': 'example1'})
# DeleteResult({'n': 1, 'ok': 1.0}, acknowledged=True)
在上方數據查詢中有find_one_and_delete 方法也可以完成刪除操作, 不過該方法不返回任何結果
clt.find_one_and_delete({'name': 'example2'})
#我來嘮家常#