註冊

如有私有伺服器可參考官網架設教學,這邊使用官方免費的 MongoDB Atlas 作範例

  1. 註冊 MongoDB Atlas
  2. 選擇 Shared 免費資料庫方案
  3. 選擇 資料庫位置,這邊以 Google Cloud 在台灣之伺服器作為示範
    選擇完點選建立 完成註冊後等待約 3 分鐘建立 server 即可開始使用
  4. 取得連線連接
    1. 點選 CONNECT
    2. 設定連接資訊
      因環境 IP 不固定,測試階段可先開啟所有 IP
      選擇 Allow Access from Anywhere 接受所有連線
      底下的 Username 以及 Password 自行設定後點擊 Create Database User 並點擊 Choose a connection method 按鈕
    3. 選擇 Connect your application
    4. 選擇 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 pymongo
client = pymongo.MongoClient("mongodb+srv://<user>:<password>@cluster0-o2mrc.gcp.mongodb.net/test?retryWrites=true&w=majority")

# or

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])

搜尋單筆

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)

計算資料筆數

1
mycol.find().count()

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