iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
AI & Data

我不太懂 AI,可是我會一點 Python 和 Azure系列 第 17

Day 17 Azure Cosmos DB API for MongoDB- 找個地方放資料

Azure Cosmos DB API for MongoDB- 找個地方放資料

MongoDB是一種NoSQL的資料庫,用來處理半結構化資料的資料庫系統,其儲存的資料結構可以不需要事先定義,甚至可以自由新增欄位,不需要回頭修改 schema ,可以自由定義資料結構(謎之聲:這樣真的是挺隨便的啊......)。因為很自由,所以其實適用於一開始還在開發階段,或者還在確認概念是否可行的階段,這種時候通常資料結構都還不太確定。另一方面,也適用於資料之間沒有複雜關聯性的情況,或者服務比較注重資料的可用性和取得資料的速度。我想相對而言,在 Line chatbot 上要實作人臉登入,符合上述的情況,這的確只是一個小專案,資料結構可能隨著不同的使用者,可以做不同的設計,且比起資料結構,我可能更在意 chatbot 能不能快速取得資料並且回應。

Azure Cosmos DB 是微軟的全球分佈式(globally distributed)多模型資料庫服務,支援多種資料庫,可用不同語法操作,而MongoDB也是其中一項服務。有時候,我們所設計的程式或服務,需要在全世界各個角落都能快速回應,且必須維持高度可用性,絕對不能斷線,這時候 Azure Cosmos DB 全球分佈的特性就能派上用場了。若要在多個 Azure 區域中部署自己的資料,可以在自己的帳戶中新增 Azure 的服務區域,如此一來資料就能快速支援不同區域了。

這邊 Azure Cosmos DB 提供的MongoDB服務,基本上可以想像成在 Azure 上建立MongoDB server,不同的是這個 MongoDB Server 的底層依舊是 Azure Cosmos DB,但所有操作都與一般MongoDB無異。

申請 Azure Cosmos DB API for MongoDB

  1. 進入https://portal.azure.com/#home 。
  2. 點選建立資源
  3. 搜尋並選擇 Azure Cosmos DB API for MongoDB
  4. 名稱和區域是必填項目,其他內容就是情況填寫了。如果沒有特別考量就直接依照預設條件設定。
  5. 可以考慮選擇不同的容量模式:可以選擇佈建的輸送量(provisioned throughput)和 serverless。差別就在於選擇前者,可以讓資料庫無儲存空間上限,也可以讓資料庫達到地理分散,延遲時間低於 10 毫秒;serverless 則完全沒有上述優勢,也只有 50 G 的儲存空間。如果不想想這麼多,在試用期間,就直接選擇預設值就好。
  6. 檢閱 + 建立。

主要連接字串

主要連接字串其實就是連結MongoDB的 URI。

  • 到剛剛建立好的 Azure Cosmos DB。
  • 點選快速入門。
  • 在選擇平台的地方,選擇Python
  • 複製主要連接字串

'Python'套件

pip3.7 install pymongo

示範程式

這邊不會完整教學MongoDB的用法,只會針對接下來會用到的部分做介紹。

  • 將人名與userId存入資料庫
from pymongo import MongoClient
uri = "mongodb://mongoit:...."
client = MongoClient(uri, retryWrites=False)

# 取得名為 face_register 的資料庫,若原本沒有此資料庫,此舉也能產生此資料庫
db = client['face_register']
# 取得名為 line 的 collection,若原本沒有此 collection,此舉也能產生此 collection
collect = db['line']
post = {"name": "Triathlon", "userId": "1234567890"}}
collect.insert_one(post)

特別一提的是,這邊所使用的userId,是 Line 針對每個 chatbot 的每個使用者所做出來的 unique ID,所以同一個使用者在不同的 Line chatbot 之中,會有不同的userId,而且也跟在 Line App 上看到的 user ID 不同。我們可以利用 chatbot 取得 event 時,透過 event.source.user_id 取得 userId。將人名與userId存入資料庫之後,下一篇文章提到的人臉登入,才可以進行身份比對。

  • 取得資料
collect.find_one({"name": "Triathlon"})

  • 紀錄登入的時間
from datetime import datetime
collect_login = db["daily_login"]
now = datetime.now()
post = {"userId": "1234567890", "time": now.timestamp()}
collect_login.insert_one(post)
  • 檢查一天之內是否有登入
yesterday = datetime.now() - timedelta(days=1)
# 檢查符合條件的有多少筆:要符合User ID 且 timestamp 在一天之內的
result = collect_login.count_documents(
    {"$and": [{"userId": "1234567890"}, {"time": {"$gte": yesterday.timestamp()}}]}
)

這邊需要用$and$gte來分別表示and>=,跟其他語法相比算是比較特別的地方。其它常用用法可參考:https://docs.mongodb.com/manual/reference/operator/query/


以上只是簡單的示範,接下來就必須考慮有關人臉登入的幾件事情:第一,需要用人臉和 Line user ID 做雙重比對;第二,需要紀錄登入時間;第三,需要確認最近一段時間內,是否曾經登入。下一篇,我們來試著實作人臉登入。


上一篇
Day 16 Azure cognitive service: Face recognition- 讓你的機器人認得你
下一篇
Day 18 Chatbot integration- Face Login- 人臉登入
系列文
我不太懂 AI,可是我會一點 Python 和 Azure30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言