筆記_mongo_04_python操作
mongo_04_python操作
固定集合
指的是mongodb中建立的固定大小集合,稱之為固定集合。
特點:
能夠淘汰早期資料, 可以控制集合的大小, 插入查詢速度較快。
使用:
日誌處理, 臨時快取。
建立:
db.createCollection(collection, {capped: true,size: 10000,max: 100})
- capped:true 建立固定集合
- size:10000 固定集合的大小(位元組)
- max:1000 最多存放多少條文件
eg.:
建立固定集合log, 設定size 1000, max 3
db.createCollection(‘log’,{capped: true, size: 1000, max: 3})
檔案的儲存
檔案儲存資料庫的方式
1.儲存路徑:將本地檔案所在的路徑以字串儲存到資料庫。
優點:節省書庫空間。
缺點:當資料庫或者檔案發生移動時必須要修改資料庫內容。
2.儲存檔案本身:將檔案轉換為二進位制儲存到資料庫。
優點:檔案隨資料庫移動,資料庫在檔案就在
缺點:佔用數庫空間大,儲存效率低
GridFS 檔案儲存方案
目的:
更好的儲存mongodb中超過16M的大檔案
方案解釋:
在mongodb資料庫中建立兩個集合,共同儲存檔案,一個儲存檔案資訊,一個存出文件內容,兩個集合相互配合。
兩個集合如下:
- fs.files: 儲存檔案資訊(檔名,檔案大小等)
- fs.chunks: 以mongodb二進位制格式儲存檔案內容
檔案的儲存:
mongofiles -d dbname(資料庫名) put files(要儲存的檔案)
注1:資料庫不存在,則會自動建立
eg.:
將某路徑下的111.mp3檔案 儲存到grid庫中 (沒有grid庫則會新建立一個)
mongofiles -d grid put …/111.mp3
檔案的獲取:
mongofiles -d dbname get files
注:file目標檔案為fs.files集合文件中的‘filename’
eg.:
從grid資料庫中獲取檔案111.mps
mongofiles -d grid get ./111.mp3
優點: 儲存方便,提供可靠的命令,方便資料庫移動.
缺點: 讀寫效率低,不建議用來儲存小檔案.
mongo shell 對 javascript
在mongo shell 下可以直接執行基本的 js 程式碼。
遊標:獲取資料庫操作結果集合的量。
var cursor = db.class0.find( ) #獲取遊標
cursor.next( ) #通過遊標獲取文件內容
cursor.hasNext( ) #檢視是否有下一個文件
python操作
pymongo (第三方python模組)
安裝:sudo pip3 install pymongo
操作步驟:
-
建立mongodb資料庫連線物件
conn = pymongo.MongoClient('localhost', 27017)
-
生成要操作的資料庫物件
db = conn.stu
或db = conn['stu']
-
生成操作的集合物件
myset = db.class0
或myset = db['class0']
-
通過集合物件呼叫函式進行資料庫連線
-
關閉資料庫連線
conn.close( )
示例:
@import “./code/mongo.py”
from pymongo import MongoClient
# 建立資料連線
conn = MongoClient('localhost', 27017)
#建立資料庫(stu)物件
db = conn.stu
#建立集合物件
myset = db.class4
#資料操作
...
插入操作
insert( ) 插入一條或多條文件
insert_many( ) 插入多條文件
insert_one( ) 插入一個文件
save( ) 插入一條或多條文件,當有_id域時,_id域重複會替換原文件。
(pymongo中save引數是字典,不能為列表))
...
#插入文件
myset.insert_many([{'name':'張鐵林','king':'乾隆'},{'name':'張國立','king':'康熙'}])
myset.insert_one({'name':'任賢齊','role':'楊過'})
myset.insert([{'name':'李若彤','role':'小龍女'},{'name':'劉亦菲','role':'王語嫣'}])
myset.save({'name':'胡軍','role':'蕭峰'})
myset.save({'_id':1, 'name':'李亞鵬', 'role':'郭靖'})
myset.save({'_id':1, 'name':'林志穎', 'role':'段譽'})
...
查詢操作
find( )
功能: 查詢所有文件
引數: 同mongo shell 中的find
返回: 遊標變數
注1:pymongo中,在操作資料庫時,mongodb shell中所有的操作符($sum等)均使用引號引起來,當做字串傳入。
注2:mongodb中,true /false使用python的True /False即可,null使用python的None即可。
- cursor遊標物件屬性函式
next( ) 獲取下一個文件
limit( ) 顯示前幾條文件
skip( ) 跳過前幾條顯示後面的內容
count( ) 統計計數
sort( ) 排序
pythongo: sort([(‘age’,1)(‘name’,1)])
mongo shell: sort({age:1,name:-1})
注1:當使用遊標物件(cursor)物件呼叫limit /skip /sort等函式取值時,要求遊標必須是初始遊標,即沒有被for 或者next取值過。
find_one( )
功能: 查詢一條文件
引數: 同find
返回值: 一個字典(注:與find方法不同,find返回的是一個函式物件)
#查詢操作
cursor = myset.find({'role':{'$exists':True} },{'_id': 0})
print(cursor) #得到一個函式物件
for i in cursor:
print(i['name'],'***',i['role'])
print(cursor.next( )) #列印下一條文件
print(cursor.next( ))
for i in cursor.skip(1).limit(3):#跳過第一條,取後2條文件
print(i)
for i in cursor.sort([('name', 1)]):
for i in cursor.sort([('name', 1),('role',-1)]): #複合排序
print(i)
dic = {'$or':[{'role':{'$exists':False}},{'name':'古天樂'}]}
d = myset.find_one(dic)
print(d)
修改操作
update( )
update_one( )
update_many( )
#修改操作
myset.update_one({'king':{'$exists':True}},{'$set':{'name':'陳小春','king':'韋小寶'}})
myset.update_many({'king':{'$exists':True}},{'$rename':{'king':'role'}})
myset.update({'name':'張國立'},{'$set':{'name':'張衛健'}})
myset.update({'name':'高圓圓'},{'$set':{'role':'周芷若'}}, upsert=True)
刪除操作
remove(query, multi=True)
注:預設(True)刪除多個,當multi設定為False時,刪除一個
delete( )
delete_one( )
delete_many( )
#刪除操作
myset.delete_one({'name':'張鐵林'})
myset.delete_many({'role':'康熙'})
myset.remove({'name':'林志穎'})
索引聚合操作
createIndex( )
功能: 建立索引
引數: 域名,則預設對該域建立正向索引,
傳入列表,列表中每個二維元組代表一個索引項
eg.: [(‘age’,-1)] #對age建立逆向索引
list_indexes( ) 檢視索引
drop_index( ) 刪除一個索引
drop_indexes( ) 刪除所有索引
聚合操作
aggregate([ ])
引數: 同mongodb shell中的聚合
返回值: 返回一個和find函式相同的遊標物件
示例:@impoet “./code/mongo1.py”
from pymongo import MongoClient
# 建立資料連線
conn = MongoClient('localhost', 27017)
#建立資料庫(stu)物件
db = conn.stu
#建立集合物件
myset = db.class0
#建立索引
# index_name = myset.create_index('name')
# print(index_name)
# index_name = myset.create_index([('age',-1)]) #逆向索引
# #檢視索引
# for i in myset.list_indexes( ):
# print(i)
#刪除索引
# myset.drop_index('name_1')
# myset.drop_indexes( ) #刪除所有索引(不刪除_id)
#其他索引型別
# index = myset.create_index('name',unique=True,sparse=True)#為name建立唯一/稀疏索引
#聚合操作
l = [{'$group':{'_id':"$sex",'num':{'$sum':1}}}]
cursor = myset.aggregate(l)
for i in cursor:
print(i)
conn.close( )
檔案操作
GridFS檔案提取
import gridfs
-
連線資料庫,生成資料庫物件(db)
-
生成gridfs物件
fs = gridfs.GridFS(db)
-
通過fs獲取儲存的檔案集合
files = fd.find( )
-
挑選想獲取的檔案進行讀取
@import “./code/grid_read.py”
from pymongo import MongoClient
import gridfs
#獲取資料庫物件
conn = MongoClient('localhost', 27017)
db = conn.grid
#獲取檔案集合物件
fs = gridfs.GridFS(db)
#獲取檔案集
files = fs.find( )
for file in files:
# print(file.filename) #filename獲取檔名稱
if file.filename == './Fairy In The Midnight [mqms2].mp3':
with open(file.filename,'wb') as f:
#從資料庫讀取
data = file.read( )
#寫入本地
f.write(data)
conn.close( )
GridFS檔案儲存
- 連線資料庫,生成資料庫物件(db)
- 生成gridfs物件
fs = gridfs.GridFS(db)
- 通過fs.put( )函式將讀取出來的檔案內容存入資料庫
fs.put(data, filesname)
引數: data 要存入的二進位制內容
filesname 檔案存入的名稱
@import “./code/grid_write.py”
from pymongo import MongoClient
import gridfs
#獲取資料庫物件
conn = MongoClient('localhost', 27017)
db = conn.grid
#獲取檔案集合物件
fs = gridfs.GridFS(db)
#將本地檔案讀取出來,寫入到資料庫中
with open('./444.mp3','rb') as f:
fs.put(f.read( ), filename='mm.jpg')
conn.close( )