python 操做mongodb

之前搞過python和mongodb,時間長了 就忘了, 而且每次找百度也不是特別方便, 今天就此整理一下。首先來看最基礎的python

CRUD操做

from pymongo import MongoClient 
 
#建立鏈接
conn =  MongoClient("mongodb://root:root@127.0.0.1:27017/")
 
#建立數據庫對象
db = conn.stu 
 
#建立集合對象
myset = db.class4 
 
print(dir(myset))
 
# 插入操做
myset.insert({'name':'張鐵林','King':'乾隆'})
myset.insert([{'name':'張國立','King':'康熙'}, {'name':'陳道明','King':'康熙'}])
myset.insert_many([{'name':'唐國強','King':'雍正'}, {'name':'陳建斌','King':'雍正'}])
myset.insert_one({'name':'鄭少秋','King':'乾隆'})
myset.save({'_id':1,'name':'聶遠','King':'乾隆'}) 
 
# 查找操做
 
cursor = myset.find({},{'_id':0})
 
# i爲每一個文檔對應的字典
for i in cursor:
    print(i['name'],'--->',i['King'])
 
myset = db.class1 
# 操做符使用引號變爲字符串
cursor = myset.find({'age':{'$gt':30}},{'_id':0})
 
cursor.limit(2)#獲取前兩個文檔
cursor.skip(2) #跳過前兩個
cursor.sort([('age',-1),('name',1)]) #對遊標內容排序
 
for i in cursor:
    print(i)
#print(cursor.next()) #獲取下一個文檔
 
 
dic = {'$or':[{'age':{'$gt':35}},{'gender':'w'}]}
data = myset.find_one(dic,{'_id':0})
print(data)
 
# 修改操做
myset.update({'name':'張國立'},{'$set':{'king_name':'玄燁'}})
myset.update({'name':'霍建華'},{'$set':{'King':'乾隆'}}, upsert = True)
myset.update({'King':'乾隆'},{'$set':{'king_name':'弘曆'}},multi = True)
myset.update_one({'King':'康熙'},{'$set':{'king_name':'愛新覺羅玄燁'}})
myset.update_many({'King':'雍正'}, {'$set':{'king_name':'胤禛'}})
 
# 刪除操做
myset.remove({'King':'康熙'})
myset.remove({'King':'乾隆'},multi = False)
 
#查找並刪除
print(myset.find_one_and_delete({'King':'乾隆'}))
 
#關閉鏈接
conn.close()

索引操做

from pymongo import MongoClient 
 
#建立鏈接
conn = MongoClient("mongodb://root:root@127.0.0.1:27017/")
 
#建立數據庫對象
db = conn['stu'] 
 
myset = db['class1'] 
 
# 刪除全部索引
myset.drop_indexes()
 
# 建立索引
index = myset.ensure_index('name')
# 建立複合索引
index = myset.ensure_index([('name',-1),('age',1)])
print(index)
 
# 刪除一個索引
myset.drop_index('name_1')
 
# 建立特殊索引
index = myset.ensure_index('name',name = "myIndex", unique = True,sparse = True)
 
# 查看集合中的索引
for i in myset.list_indexes():
    print(i)
 
myset = db.class4 
 
l = [
    {'$group':{'_id':'$King','num':{'$sum':1}}},
    {'$match':{'num':{'$gt':1}}}
]
 
cursor = myset.aggregate(l)
for i in cursor:
    print(i)
 
conn.close()

以二進制的形式 讀寫文件(以圖片爲例)

from pymongo import MongoClient 
import bson.binary 
 
conn = MongoClient("mongodb://root:root@127.0.0.1:27017/")
db = conn.images 
myset = db.img 
 
#存儲
f = open('/root/test.jpg','rb')
 
#轉換爲mongodb的二進制數據存儲形式
content = bson.binary.Binary(f.read())
 
#插入到數據庫
myset.insert({'filename':'test.jpg','data':content})
 
#提取
 
data = myset.find_one({'filename':'test.jpg'})
 
#經過字典獲取到數據庫內容寫入本地
with open('/root/test2.jpg','wb') as f:
    f.write(data['data'])
 
conn.close()

借用GridFS來處理文件

from pymongo import MongoClient
from gridfs import *
 
conn = MongoClient("mongodb://root:root@127.0.0.1:27017/")
db = conn.image 
 
#存儲
f = open('/root/test.jpg','rb')
#建立寫入流
imgput = GridFS(db)
#將數據寫入,文件類型和名稱經過前面的分割獲得
insertimg=imgput.put(f,content_type='jpg',filename='/root/test.jpg')
f.close()
#建立成功後,會在集合中生成fs.flies和fs.chunks
 
gridFS = GridFS(db, collection="fs")
for grid_out in gridFS.find():
    data = grid_out.read() # 獲取圖片數據
    outf = open('/root/test3.jpg','wb')#建立文件
    outf.write(data)  # 存儲圖片
    outf.close()
 
conn.close()

有關GridFS的描述:nginx

1、概述web

    GridFS是基於mongodb存儲引擎是實現的「分佈式文件系統」,底層基於mongodb存儲機制,和其餘本地文件系統相比,它具有大數據存儲的多個優勢。GridFS適合存儲超過16MB的大型文件,不過16M數據在當今互聯網時代,已經不足爲奇。咱們可使用GridFS構建大規模的「圖片服務器」、「文檔服務器」、「視頻、音頻」文件服務器,GridFS對於web應用,能夠結合nginx插件「ningx-gridfs」可以簡單的實現負載均衡等特性,很是便捷;能夠簡單認爲GridFS是爲web應用而生。我的認爲,目前架構比較簡單的NoSQL文件系統中GridFS是最優秀的。mongodb

    GridFS並非將單個文件直接存儲爲一個document,而是將文件分紅多個parts或者說chunks,而後將每一個chunk做爲做爲一個單獨的document存儲,而後將chunks有序保存。默認狀況下,GridFS的chunk大小位255k。GridFS使用2個collections來存儲這些文件,一個collection存儲文件的chunks(實際文件數據),另外一個則存儲文件的metadata(用戶自定義的屬性,filename,content-type等)。數據庫

    當用戶查詢GridFS中的文件時,客戶端或者driver將會從新按序組裝這些chunks。用戶能夠range查詢文件,也能夠獲取文件的任意部分的信息,好比:跳過(skip)視頻或者音頻(任何文件)的中間部,實現「range access of single file」。服務器

    對於mongodb而言,每一個document最大尺寸爲16M,若是想存儲一條數據(好比一個文件)超過16M,那麼只能使用GridFS支持;GridFS能夠支持單個文件尺寸達到數G,讀取文件時能夠分段讀取。此外,GridFS能夠從Mongodb的高性能、高可用特性中獲益,好比咱們能夠在「replica set」或者「sharding」架構模式下使用GridFS。架構

2、使用場景app

    document的大小超過16M是使用GridFS的條件之一,由於mongodb普通的collection沒法支持16M以上的document,咱們不得不選擇其餘方案;在一些狀況下,將這些大文件存儲在GridFS中,比直接存儲在本地文件系統中更加適合:負載均衡

    1)若是你的文件系統對每一個目錄下文件的個數有限制(或者太多,將會影響文件的打開速度等)。分佈式

    2)若是你的文件數據,有分數據中心鏡像保存(大數據狀況,可用性保證)。

    3)若是你但願訪問一個超大的文件,而不但願將它所有加入內存,而是有「range access」的狀況,即分段讀取,那麼GridFS天生就具有這種能力,你能夠隨意訪問任意片斷。

    對於一個大文件,若是你但願原子性的更新它的所有內容,那麼GridFS將不適合;好比同時更新一個文件的多個chunk,由於mongodb自己沒有事務機制。

    對於小於16M的文件,好比一些圖片、CSS、js文件等,應該將它們直接存儲在普通的collection中而非GridFS(bindata,參見org.bson.types.Binary),由於它們一般較小,GridFS沒法發揮其優點。固然,你爲了統一application的「文件系統」存儲方式,也能夠將這些小文件保存在GridFS中,性能也不會差的太多,爲了提高性能,對這些小文件,能夠在存儲時手動設置它的chunkSize,避免文件被切分紅多個chunks來提升性能。

相關文章
相關標籤/搜索