Python 全棧系列44 - pymongo的基本使用

yukai08008發表於2020-11-02

說明

基於業務和操作的場景的不同,有幾個常用的資料庫是繞不開的,好在python都有對應的介面:

資料庫Python介面包用途
mysqlpymysql用於存比較靜態的主資料,例如使用者資訊,報表等
mongopymongo用於存非結構化的資訊,可以存日誌級的資訊;例如使用者發過來的json
redisredis用於處理大量高頻的資料訪問,也可以用於簡單訊息佇列
neo4jpy2neo用於儲存結構資訊(元資訊),例如演算法的結構,網站的機構,關係網路等

這裡主要是先對mongo進行一下回顧(回憶)

安裝啟動

以前在mac上手動安裝的,忘記了,應該是很簡單的。以後都是用docker了,所以不提安裝。

在mac上的啟動:
前端啟動(終端顯示)

mongod --dbpath ~/data/db

後臺啟動。注意這裡有兩個坑:1是要制定的log是檔案,不是目錄;2是路徑必須是絕對路徑,不能想上面那樣簡寫

mongod  --dbpath=YOURABSPATH/data  --logpath=YOURABSPATH/data/log/mongodb.log --fork

隨便輸幾條基本命令(不需要加分號)

        + 1 >>> show dbs  | 裡面有baidu庫
        + 2 >>> use baidu 
        + 3 >>> show collections
        + 4 >>> db.gps.find() | 查詢所有資料

在這裡插入圖片描述
mongo預設沒有設定使用者和密碼,需要設定的話可以參考這篇文章

ubuntu上的安裝我以前捋過,先放著吧

  • 1 sudo apt-get install mongodb 安裝服務, 參考這篇文章
  • 2 啟動 service mongodb start (後臺啟動)
  • 3 檢視 pgrep mongo -l
  • 4 停止 service mongodb stop
  • 5 修改遠端訪問:sudo vi /etc/mongodb.conf
    • bind_ip 改為 0.0.0.0
    • 考慮如果是個人的資料,不在伺服器長存,如果是伺服器執行,那麼需要發給訊息佇列轉本地儲存

-6 重啟 service mongodb restart

通過pymongo訪問

from pymongo import MongoClient
from datetime import datetime
conn =  MongoClient('localhost', 27017)

# 1 選擇資料庫。連線mydb資料庫,沒有則自動創
db = conn.my1 # 也可以使用 conn['my1']
# 2 選擇一個集合(相當於選擇一張表)。使用test_set集合,沒有則自動建立
test_coll = db['coll']
# 3 製造一條資料進行測試

test_dict1 = {}
test_dict1['name'] = 'andy'
test_dict1['occupation'] = 'Data Scientist'
test_dict1['age'] = 111
test_dict1['opr_ts'] = datetime.now()
# 增 / insert_one 和 insert_many
res_create = test_coll.insert_one(test_dict1)

# 刪 / delete_one 和 delete_many
# res_delete = test_coll.delete_one({'name':'andy'})

# 改 / 
# 另外我們還可以使用 $set 操作符對資料進行更新。使用$set則只更新字典記憶體在的欄位,
# 其它欄位則不更新,也不刪除。如果不用則會更新所有的資料,而其它存在的欄位則會被刪除。

test_dict2 = {}
test_dict2['age'] = 222
# update 會整條重新整理掉 | 已經不建議使用了
# update_one配合$只會重新整理已存在的
# res_update = test_coll.update({'name': 'andy'}, test_dict2)
res_update = test_coll.update_one({'name':'andy'}, {'$set':test_dict2})
# res_update中返回的內容有是否成功,匹配幾條,改變幾條等資訊
# 可以參考這個連結,裡面有很多實用內容 https://www.cnblogs.com/nixingguo/p/7260604.html

# 查: find有很多方法,直接找一條,找到一條刪一條...  (利用自動聯想可以找到很多)
# res_find = test_coll.find_one({'age':{'$gt':30}})

res_find = test_coll.find({'age': {'$gt': 30}}) # find要用list展示出來
# datetime也可以使用timestamp方法將日期轉為時間戳
'''
比較符號歸納:
1. $lt  小於{'age': {'$lt': 20}}
2. $gt  大於{'age': {'$gt': 20}}
3. $lte 小於等於{'age': {'$lte': 20}}
4. $gte 大於等於{'age': {'$gte': 20}}
5. $ne  不等於{'age': {'$ne': 20}}
6. $in  在範圍內{'age': {'$in': [20, 23]}}
7. $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]}}年齡模50
$text文字查詢{'$text': {'$search': 'Mike'}}text型別的屬性中包含Mike字串
$where高階條件查詢{'$where': 'obj.fans_count == obj.follows_count'}自身粉絲數等於關注數


# 排序
# 可以呼叫sort方法,傳入排序的欄位及升降序標誌即可,示例如下:
results = collection.find().sort('name', pymongo.ASCENDING)
# 偏移,可能想只取某幾個元素,在這裡可以利用skip()方法偏移幾個位置,比如偏移2,就忽略前2個元素,得到第三個及以後的元素。
results = collection.find().sort('name', pymongo.ASCENDING).skip(2)

# 用列表迴圈的方式獲取值
[result['name'] for result in results]


1.帶條件刪除
db.user.remove({“name”:“zhangshan”});
2.刪除所有數
db.user.remove({})
3.刪除集合
db.user.drop()
4.刪除整個資料庫
show dbs;
db.user.getDB()
db.dropDatabase()

mongodb刪除集合後磁碟空間不釋放,用db.repairDatabase()去修復才能釋放。
但是在修復的過程中如果出現了非正常的mongodb的掛掉,再次啟動時啟動不了的,需要先修復才可以,
可以利用./mongod --repair --dbpath=/data/mongo/,
如果你是把資料庫單獨的放在一個資料夾中指定dbpath時就指向要修復的資料庫就可以,修復可能要花費很長的時間,
在使用db.repairDatabase()去修復時一定要停掉讀寫,並且mongodb要有備機才可以,
不然千萬不要隨便使用db.repairDatabase()來修復資料庫,切記。

基本的操作內容就這麼多吧,之後就結合實際使用來看。

案例

原來我還做過離線的tdf-idf計算,使用mongo儲存,等有時間的時候整理一下。

待續…

相關文章