1. 程式人生 > >筆記_mongo_04_python操作

筆記_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

操作步驟:

  1. 建立mongodb資料庫連線物件
    conn = pymongo.MongoClient('localhost', 27017)

  2. 生成要操作的資料庫物件
    db = conn.stu  或 db = conn['stu']

  3. 生成操作的集合物件
    myset = db.class0 或 myset = db['class0']

  4. 通過集合物件呼叫函式進行資料庫連線

  5. 關閉資料庫連線
    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

  1. 連線資料庫,生成資料庫物件(db)

  2. 生成gridfs物件
    fs = gridfs.GridFS(db)

  3. 通過fs獲取儲存的檔案集合
    files = fd.find( )

  4. 挑選想獲取的檔案進行讀取

@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檔案儲存

  1. 連線資料庫,生成資料庫物件(db)
  2. 生成gridfs物件
    fs = gridfs.GridFS(db)
  3. 通過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( )