說在前面
雖然漢語是母語,理解起來比較快速。但是有時候有些常用詞沒有必要翻譯,翻譯了反而造成不必要的麻煩,mongodb 里面的關鍵性的術語,我都不會翻譯,直接用英文。寫成全英文,不是不可以,只是始終讀起來反應速度要比讀中文慢一點,即使是我自己寫的英文。
基本概念
mongo 是文檔型數據庫,其數據結構都是 field + value 的鍵值對的形式。外形類似于 JSON,但其實是 BSON 格式(也就是二進制的 JSON,其中,BSON 的字符串采用 UTF-8 編碼)。
一個 BSON document
一個 collection
運行 mongo,進入交互界面。首先在命令行里熟悉一下:
help;
show dbs; # 顯示所有數據庫
use db_name; # 切換或者創建數據庫
# 再次 show dbs 不會顯示這個新數據庫,需要插入數據才行
插入數據前,先建立 collection。
db.createCollection('staff')
插入單條的 document:
db.staff.insertOne({'name': 'Sue', 'age': 29})
插入多條 ducuments:
db.staff.insertMany([
{'name': 'Eloisa', 'age':27},
{'name': 'Brandy', 'age':26},
{'name': 'Dora', 'age': 24, 'gender': 'female'}
])
值得一提的是,就算突然多加入了一個 field 也不會對原有數據造成影響。
這是查找 Dora 這條數據的兩個方法。
db.staff.find({'name':'Dora'})
db.staff.find({'gender':'female'})
唯一索引
作用就是防止添加含有重復的鍵的數據到數據庫。例如確保 collection "lagou_items" 的鍵 "positionId" 保持唯一。只看鍵是否重復,不看值。
db.lagou_items.createIndex({'postionId': 1}, {'unique': true})
db.lagou_items.insertOne({'positionId': 666}) # 正常
db.lagou_items.insertOne({'positionId': 888}) # 報錯 E11000 duplicate key error collection
PyMongo
和本地的 mongo 數據庫連接。
from pymongo import MongoClient
client = MongoClient()
client.database_names() # 返回現有的數據庫
# ['admin', 'config', 'local', 'weng']
db = client.weng # weng 是一個 db 的名字
插入數據。和 mongo 本身的寫法非常相似,但是 insert_one 的命名方式延續了 Python 的風格。注意這里插入的不是 JSON 或 BSON,而是 dict 對象。
db.jobs.insert_one({'Michael': 25}) # 返回
新插入的數據默認情況下自帶一個 _id 字段。我先來試著搜一下剛剛放進去的數據:
>>> db.staff.find_one()
{'_id': ObjectId('5b05602efc68c46bb1aa61e9'), 'age': 29.0, 'name': 'Sue'}
>>> db.staff.find_one({'name':'brandy'})
>>> db.staff.find_one({'name':'Brandy'})
{'_id': ObjectId('5b0560d1fc68c46bb1aa61eb'), 'age': 26.0, 'name': 'Brandy'}
從上面可以看出,find_one 無參數時返回整個 collection 的第一項。查詢的時候是區分大小寫的。
以上都是最最基礎的幾條命令,學會了之后繼續拓展只是一個查文檔+重復+記憶的過程了。此外,還有必要刻意比較一下 sql 和 nosql 數據庫的差異。來日卻來理會。
Until then,
Happy hacking!