註冊
如有私有伺服器可參考官網架設教學,這邊使用官方免費的 MongoDB Atlas 作範例
註冊 MongoDB Atlas
選擇 Shared
免費資料庫方案
選擇 資料庫位置,這邊以 Google Cloud 在台灣之伺服器作為示範
選擇完點選建立
完成註冊後等待約 3 分鐘建立 server 即可開始使用
取得連線連接
點選 CONNECT
設定連接資訊
因環境 IP 不固定,測試階段可先開啟所有 IP
選擇 Allow Access from Anywhere
接受所有連線
底下的 Username
以及 Password
自行設定後點擊 Create Database User
並點擊 Choose a connection method
按鈕
選擇 Connect your application
選擇 Python 3.6 就可以取得 Connection String 囉~
Python 操作
安裝 pymongo
1 2 pip install pymongo[srv] # 若安裝過程出現問題,可以改使用 pip install "pymongo[srv]"
連接資料庫
1 2 3 4 5 6 7 import pymongoclient = pymongo.MongoClient("mongodb+srv://<user>:<password>@cluster0-o2mrc.gcp.mongodb.net/test?retryWrites=true&w=majority" ) client = pymongo.MongoClient("ip" , port) client.admin.authenticate("username" ,"password" )
show
列出所有資料庫
1 client.list_database_names()
列出資料庫內所有集合
1 2 3 4 mydb=client['dbname' ] mydb.list_collection_names() mycol=mydb['colName' ]
Insert
官方不推薦使用 insert() > 建議使用 insert_one()和 insert_many()
插入單筆資料
1 2 3 4 5 6 7 student = { 'id' : '20170101' , 'name' : 'Kevin' , 'age' : 19 , 'gender' : 'F' } mycol.insert(student)
插入多筆資料
1 2 3 4 5 6 7 8 9 10 11 12 13 14 student1 = { 'id' : '20170101' , 'name' : 'Jordan' , 'age' : 20 , 'gender' : 'male' } student2 = { 'id' : '20170202' , 'name' : 'Mike' , 'age' : 21 , 'gender' : 'male' } mycol.insert([student1, student2])
官方推薦使用方法:
1 2 mycol.insert_one(student) mycol.insert_many([student1, student2])
Search
搜尋單筆
1 result = mycol.find_one({'name' : 'Mike' })
搜尋多筆資料
1 2 3 results = mycol.find({'name' : 'Jordan' }) for result in results: print (result)
條件搜尋
1 results =mycol.find({'age' : {'$mod' : [5 , 4 ]}} )
條件搜尋符號解釋表
符號
意義
範例
$lt
小於
{'age': {'$lt': 20}}
$gt
大於
{'age': {'$gt': 20}}
$lte
小於等於
{'age': {'$lte': 20}}
$gte
大於等於
{'age': {'$gte': 20}}
$ne
不等於
{'age': {'$ne': 20}}
$in
在範圍內
{'age': {'$in': [20, 23]}}
$nin
不在範圍內
{'age': {'$nin': [20, 23]}}
符號
意義
範例
範例解釋
$regex
搜尋正則表達式
{'name': {'$regex': '^M.*'}}
name 以 M 開頭
$exists
屬性是否存在
{'name': {'$exists': True}}
name 屬性存在
$type
型態判斷
{'age': {'$type': 'int'}}
age 的型態為 int
$mod
數學運算
{'age': {'$mod': [5, 0]}}
年齡除 5 於 0
$text
文本查詢
{'$text': {'$search': 'Mike'}}
查詢所有資料型態為 text 的屬性包含 Mike
$where
高級查詢
{'$where': 'obj.fans_count == obj.follows_count'}
自身粉絲數等于關注數量
多重條件
1 2 3 4 results= mycol.find_one({"lng_max" :{"$gt" :120.64505706396704 }, "lat_max" :{"$gt" :22.286164608750784 }, "lng_min" :{"$lte" :120.64505706396704 }, "lat_min" :{"$lte" :22.286164608750784 }})
排序
升冪 : pymongo.ASCENDING
降冪 : pymongo.DESCENDING
1 results = mycol.find().sort('age' , pymongo.ASCENDING)
忽略 n 筆資料
1 results = mycol.find().sort('name' , pymongo.ASCENDING).skip(1 )
搜尋前 n 筆資料
1 results = mycol.find().sort('name' , pymongo.ASCENDING).limit(2 )
計算資料筆數
Update
官方不建議使用 update() > 建議使用 update_one() 與 update_many()
更新 1
1 2 3 4 5 condition = {'name' : 'Kevin' } student = mycol.find_one(condition) student['age' ] = 25 mycol.update(condition, student)
更新 2
1 mycol.update(condition, {'$set' : student})
更新 3
1 result = mycol.update_one(condition, {'$set' : student})
更新 4
1 2 condition = {'age' : {'$gt' : 20 }} result = mycol.update_many(condition, {'$inc' : {'age' : 1 }})
Delete
官方不建議使用 remove()
推薦使用 delete_one() 與 delete_many()
remove
1 mycol.remove({'name' : 'Kevin' })
delete
1 2 mycol.delete_one({'name' : 'Kevin' }) mycol.delete_many({'age' : {'$lt' : 25 }})
其他
find_one_and_delete() 查詢後刪除
find_one_and_replace() 查詢後替換
find_one_and_update() 查詢後更新
create_index()
create_indexes()
drop_index()
References