Python 資料持久化 - PyMongo 模組



MongoDB 是一個面向文件的NoSQL資料庫。它是一個跨平臺資料庫,在伺服器端公共許可證下分發。它使用類似 JSON 的文件作為模式。

為了提供儲存海量資料的能力,多個物理伺服器(稱為分片)相互連線,從而實現水平擴充套件。MongoDB 資料庫由文件組成。

MongoDB

文件類似於關係資料庫中表的一行。但是,它沒有特定的模式。文件是鍵值對的集合——類似於字典。但是,每個文件中鍵值對的數量可能不同。就像關係資料庫中的表有一個主鍵一樣,MongoDB 資料庫中的文件有一個稱為"_id"的特殊鍵。

在我們瞭解如何在 Python 中使用 MongoDB 資料庫之前,讓我們簡要了解一下如何安裝和啟動 MongoDB。MongoDB 提供社群版和商業版。社群版可以從www.mongodb.com/download-center/community下載。

假設 MongoDB 安裝在 c:\mongodb 中,可以使用以下命令呼叫伺服器。

c:\mongodb\bin>mongod

MongoDB 伺服器預設在埠號 22017 上活動。資料庫預設儲存在 data/bin 資料夾中,儘管可以透過 –dbpath 選項更改位置。

MongoDB 有一套自己的命令,可以在 MongoDB shell 中使用。要呼叫 shell,請使用Mongo命令。

x:\mongodb\bin>mongo

出現一個類似於 MySQL 或 SQLite shell 提示符的 shell 提示符,在該提示符之前可以執行本機 NoSQL 命令。但是,我們感興趣的是將 MongoDB 資料庫連線到 Python。

PyMongo模組由 MongoDB Inc 本身開發,以提供 Python 程式設計介面。使用眾所周知的 pip 實用程式安裝 PyMongo。

pip3 install pymongo

假設 MongoDB 伺服器已啟動並正在執行(使用mongod命令)並在埠 22017 上偵聽,我們首先需要宣告一個MongoClient物件。它控制 Python 會話和資料庫之間所有事務。

from pymongo import MongoClient
client=MongoClient()

使用此客戶端物件建立與 MongoDB 伺服器的連線。

client = MongoClient('localhost', 27017)

使用以下命令建立一個新的資料庫。

db=client.newdb

MongoDB 資料庫可以有多個集合,類似於關係資料庫中的表。集合物件由Create_collection()函式建立。

db.create_collection('students')

現在,我們可以按如下方式在集合中新增一個或多個文件。

from pymongo import MongoClient
client=MongoClient()
db=client.newdb
db.create_collection("students")
student=db['students']
studentlist=[{'studentID':1,'Name':'Juhi','age':20, 'marks'=100},
{'studentID':2,'Name':'dilip','age':20, 'marks'=110},
{'studentID':3,'Name':'jeevan','age':24, 'marks'=145}]
student.insert_many(studentlist)
client.close()

要檢索文件(類似於 SELECT 查詢),我們應該使用find()方法。它返回一個遊標,藉助該遊標可以獲取所有文件。

students=db['students']
docs=students.find()
for doc in docs:
   print (doc['Name'], doc['age'], doc['marks'] )

要查詢集合中的特定文件而不是所有文件,我們需要對find()方法應用過濾器。過濾器使用邏輯運算子。MongoDB 有一套自己的邏輯運算子,如下所示:

序號 MongoDB 運算子 & 傳統邏輯運算子
1

$eq

等於 (==)

2

$gt

大於 (>)

3

$gte

大於或等於 (>=)

4

$in

如果等於陣列中的任何值

5

$lt

小於 (<)

6

$lte

小於或等於 (<=)

7

$ne

不等於 (!=)

8

$nin

如果不等於陣列中的任何值

例如,我們有興趣獲取年齡大於 21 歲的學生列表。在find()方法的過濾器中使用$gt運算子,如下所示:

students=db['students']
docs=students.find({'age':{'$gt':21}})
for doc in docs:
   print (doc.get('Name'), doc.get('age'), doc.get('marks'))

PyMongo 模組提供update_one()update_many()方法來修改一個文件或多個滿足特定過濾器表示式的文件。

讓我們更新名稱為 Juhi 的文件的 marks 屬性。

from pymongo import MongoClient
client=MongoClient()
db=client.newdb
doc=db.students.find_one({'Name': 'Juhi'})
db['students'].update_one({'Name': 'Juhi'},{"$set":{'marks':150}})
client.close()
廣告