1. 程式人生 > >Python學習筆記——MongoDB高階操作

Python學習筆記——MongoDB高階操作

目錄

$sort

$skip

安全

超級管理員

備份與恢復

備份

恢復

聚合 aggregate

  • 聚合(aggregate)主要用於計算資料,類似sql中的sum()、avg()
  • 語法
db.集合名稱.aggregate([{管道:{表示式}}])

管道

  • 管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的輸入
ps ajx | grep mongo
  • 在mongodb中,管道具有同樣的作用,文件處理完畢後,通過管道進行下一次處理
  • 常用管道
    • $group:將集合中的文件分組,可用於統計結果
    • $match:過濾資料,只輸出符合條件的文件
    • $project:修改輸入文件的結構,如重新命名、增加、刪除欄位、建立計算結果
    • $sort:將輸入文件排序後輸出
    • $limit:限制聚合管道返回的文件數
    • $skip:跳過指定數量的文件,並返回餘下的文件
    • $unwind:將陣列型別的欄位進行拆分

表示式

  • 處理輸入文件並輸出
  • 語法
表示式:'$列名'
  • 常用表示式
    • $sum:計算總和,$sum:1同count表示計數
    • $avg:計算平均值
    • $min:獲取最小值
    • $max:獲取最大值
    • $push:在結果文件中插入值到一個數組中
    • $first:根據資源文件的排序獲取第一個文件資料
    • $last:根據資源文件的排序獲取最後一個文件資料

$group

  • 將集合中的文件分組,可用於統計結果
  • _id表示分組的依據,使用某個欄位的格式為'$欄位'
  • 例1:統計男生、女生的總人數
db.stu.aggregate([
    {$group:
        {
            _id:'$gender',
            counter:{$sum:1}
        }
    }
])

Group by null

  • 將集合中所有文件分為一組
  • 例2:求學生總人數、平均年齡
db.stu.aggregate([
    {$group:
        {
            _id:null,
            counter:{$sum:1},
            avgAge:{$avg:'$age'}
        }
    }
])

透視資料

  • 例3:統計學生性別及學生姓名
db.stu.aggregate([
    {$group:
        {
            _id:'$gender',
            name:{$push:'$name'}
        }
    }
])
  • 使用$$ROOT可以將文件內容加入到結果集的陣列中,程式碼如下
db.stu.aggregate([
    {$group:
        {
            _id:'$gender',
            name:{$push:'$$ROOT'}
        }
    }
])

$match

  • 用於過濾資料,只輸出符合條件的文件
  • 使用MongoDB的標準查詢操作
  • 例1:查詢年齡大於20的學生
db.stu.aggregate([
    {$match:{age:{$gt:20}}}
])
  • 例2:查詢年齡大於20的男生、女生人數
db.stu.aggregate([
    {$match:{age:{$gt:20}}},
    {$group:{_id:'$gender',counter:{$sum:1}}}
])

$project

  • 修改輸入文件的結構,如重新命名、增加、刪除欄位、建立計算結果
  • 例1:查詢學生的姓名、年齡
db.stu.aggregate([
    {$project:{_id:0,name:1,age:1}}
])
  • 例2:查詢男生、女生人數,輸出人數
db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$project:{_id:0,counter:1}}
])

$sort

  • 將輸入文件排序後輸出
  • 例1:查詢學生資訊,按年齡升序
b.stu.aggregate([{$sort:{age:1}}])
  • 例2:查詢男生、女生人數,按人數降序
db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$sort:{counter:-1}}
])

$limit

  • 限制聚合管道返回的文件數
  • 例1:查詢2條學生資訊
db.stu.aggregate([{$limit:2}])

$skip

  • 跳過指定數量的文件,並返回餘下的文件
  • 例2:查詢從第3條開始的學生資訊
db.stu.aggregate([{$skip:2}])
  • 例3:統計男生、女生人數,按人數升序,取第二條資料
db.stu.aggregate([
    {$group:{_id:'$gender',counter:{$sum:1}}},
    {$sort:{counter:1}},
    {$skip:1},
    {$limit:1}
])
  • 注意順序:先寫skip,再寫limit

$unwind

  • 將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值

語法1

  • 對某欄位值進行拆分
db.集合名稱.aggregate([{$unwind:'$欄位名稱'}])
  • 構造資料
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
  • 查詢
db.t2.aggregate([{$unwind:'$size'}])

語法2

  • 對某欄位值進行拆分
  • 處理空陣列、非陣列、無欄位、null情況
db.inventory.aggregate([{
    $unwind:{
        path:'$欄位名稱',
        preserveNullAndEmptyArrays:<boolean>#防止資料丟失
    }
}])
  • 構造資料
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
  • 使用語法1查詢
db.t3.aggregate([{$unwind:'$size'}])
  • 檢視查詢結果,發現對於空陣列、無欄位、null的文件,都被丟棄了
  • 問:如何能不丟棄呢?
  • 答:使用語法2查詢
db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])

安全

超級管理員

  • 為了更安全的訪問mongodb,需要訪問者提供使用者名稱和密碼,於是需要在mongodb中建立使用者
  • 採用了角色-使用者-資料庫的安全管理方式
  • 常用系統角色如下:
    • root:只在admin資料庫中可用,超級賬號,超級許可權
    • Read:允許使用者讀取指定資料庫
    • readWrite:允許使用者讀寫指定資料庫
  • 建立超級管理使用者
use admin
db.createUser({
    user:'admin',
    pwd:'123',
    roles:[{role:'root',db:'admin'}]
})

啟用安全認證

  • 修改配置檔案
sudo vi /etc/mongod.conf
  • 啟用身份驗證
  • 注意:keys and values之間一定要加空格, 否則解析會報錯
security:
  authorization: enabled
  • 重啟服務
sudo service mongod stop
sudo service mongod start
  • 終端連線
 mongo -u 'admin' -p '123' --authenticationDatabase 'admin'

普通使用者管理

  • 使用超級管理員登入,然後進入使用者管理操作
  • 檢視當前資料庫的使用者
use test1
show users
  • 建立普通使用者
db.createUser({
    user:'t1',
    pwd:'123',
    roles:[{role:'readWrite',db:'test1'}]
})
  • 終端連線
mongo -u t1 -p 123 --authenticationDatabase test1
  • 切換資料庫,執行命令檢視效果

  • 修改使用者:可以修改pwd、roles屬性

db.updateUser('t1',{pwd:'456'})

複製(副本集)

什麼是複製

  • 複製提供了資料的冗餘備份,並在多個伺服器上儲存資料副本,提高了資料的可用性,並可以保證資料的安全性
  • 複製還允許從硬體故障和服務中斷中恢復資料

為什麼要複製

  • 資料備份
  • 資料災難恢復
  • 讀寫分離
  • 高(24* 7)資料可用性
  • 無宕機維護
  • 副本集對應用程式是透明

複製的工作原理

  • 複製至少需要兩個節點A、B...
  • A是主節點,負責處理客戶端請求
  • 其餘的都是從節點,負責複製主節點上的資料
  • 節點常見的搭配方式為:一主一從、一主多從
  • 主節點記錄在其上的所有操作,從節點定期輪詢主節點獲取這些操作,然後對自己的資料副本執行這些操作,從而保證從節點的資料與主節點一致
  • 主節點與從節點進行資料互動保障資料的一致性

複製的特點

  • N 個節點的叢集
  • 任何節點可作為主節點
  • 所有寫入操作都在主節點上
  • 自動故障轉移
  • 自動恢復

設定複製節點

  • 接下來的操作需要開啟多個終端視窗,而且可能會連線多臺ubuntu主機,會顯得有些亂,建議在xshell中實現
  • step1:建立資料庫目錄t1、t2
  • 在Desktop目錄下演示,其它目錄也可以,注意許可權即可
mkdir t1
mkdir t2
  • step2:使用如下格式啟動mongod,注意replSet的名稱是一致的
mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
  • step3:連線主伺服器,此處設定192.168.196.128:27017為主伺服器
mongo --host 192.168.196.128 --port 27017
  • step4:初始化
rs.initiate()
  • 初始化完成後,提示符如下圖:

  • step5:檢視當前狀態
rs.status()
  • 當前狀態如下圖:

  • step6:新增複本集
rs.add('192.168.196.128:27018')
  • step7:複本集新增成功後,當前狀態如下圖:

  • step8:連線第二個mongo服務
mongo --host 192.168.196.128 --port 27018
  • 連線成功後,提示符如下圖:

初始化

  • step9:向主伺服器中插入資料
use test1
for(i=0;i<10;i++){db.t1.insert({_id:i})}
db.t1.find()
  • step10:在從伺服器中插查詢
  • 說明:如果在從伺服器上進行讀操作,需要設定rs.slaveOk()
rs.slaveOk()
db.t1.find()

其它說明

  • 刪除從節點
rs.remove('192.168.196.128:27018')
  • 關閉主伺服器後,再重新啟動,會發現原來的從伺服器變為了從伺服器,新啟動的伺服器(原來的從伺服器)變為了從伺服器

備份與恢復

備份

  • 語法
mongodump -h dbhost -d dbname -o dbdirectory
  • -h:伺服器地址,也可以指定埠號
  • -d:需要備份的資料庫名稱
  • -o:備份的資料存放位置,此目錄中存放著備份出來的資料
  • 例1
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢復

  • 語法
mongorestore -h dbhost -d dbname --dir dbdirectory
  • -h:伺服器地址
  • -d:需要恢復的資料庫例項
  • --dir:備份資料所在位置
  • 例2
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

與python互動

進入虛擬環境
sudo pip install pymongo
或原始碼安裝
python setup.py
  • 引入包pymongo
import pymongo
  • 連線,建立客戶端
client=pymongo.MongoClient("localhost", 27017)
  • 獲得資料庫test1
db=client.test1
  • 獲得集合stu
stu = db.stu
  • 新增文件
s1={name:'gj',age:18}
s1_id = stu.insert_one(s1).inserted_id
  • 查詢一個文件
s2=stu.find_one()
  • 查詢多個文件1
for cur in stu.find():
    print cur
  • 查詢多個文件2
cur=stu.find()
cur.next()
cur.next()
cur.next()
  • 獲取文件個數
print stu.count()

相關推薦

Python學習筆記——MongoDB高階操作

目錄 $sort $skip 安全 超級管理員 備份與恢復 備份 恢復 聚合 aggregate 聚合(aggregate)主要用於計算資料,類似sql中的sum()、avg() 語法 db.集合名稱.aggrega

python學習筆記文件操作(六)

python1、文件操作流程:打開文件,得到文件句柄並賦值給一個變量通過句柄對文件進行操作關閉文件如下文件:2017-03-24 11:25:06:349 - info: [debug] [AndroidBootstrap] Sending command to android: {"cmd":"shutdo

Python學習筆記文件操作

color 學習 技術 寫入 自己 adl txt文件 格式 class 隨筆記錄方便自己和同路人查閱。 #------------------------------------------------我是可恥的分割線---------------------------

Python學習筆記DAY4---檔案操作

        檔案的操作是一個程式語言必不可少的,Python也不例外,檔案的開啟使用了open()來實現。 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline

Python學習筆記系列——高階函數(map/reduce)

from 類型 fun 轉換 浮點 color normal 整數 cto from functools import reduce #變量可以指向函數,函數的參數能接受變量,那麽一個函數就可以接受另一個函數作為參數,這種函數被稱之為高階函數 def add(x,y

Python學習筆記系列——高階函式(map/reduce)

一、map #變數可以指向函式,函式的引數能接受變數,那麼一個函式就可以接受另一個函式作為引數,這種函式被稱之為高階函式 def add(x,y,f): return f(x)+f(y) print(add(-5,-9,abs)) ''' map()函式接受兩個引數,一個是函式,

Python學習筆記系列——高階函式(filter/sorted)

一、filter #filter()函式用於過濾序列。和map()類似,也接收一個函式和一個序列,把函式依次作用於每個元素,根據返回值是True還是False決定是否保留該元素。 #filter()函式返回的是一個Iterator,即惰性序列,所以要強迫filter()完成計算結果,需要用list(

python學習筆記之基礎操作(五)字串格式化(1)%格式化

格式化基本格式 s = "i am %s ,i am %d years old ,and i like %s"%("haiyang",20,"zhu") print(s) #區分資料型別,無法自動在字串

python學習筆記之基礎操作(五)字串格式化(2)format

format格式化 1,基本格式 #對於每一個大括號,在後面的引數中找到對應的引數插進來 #format操作類似於於將傳入的引數製成多個數據的資料結構元組或者字典,然後依照索引插入引數 s = "i a

python學習筆記之基礎操作(六)生成器和迭代器

生成器總結 語法上和函式類似:生成器函式幾乎和常規函式一樣,不同的又兩點, 第一點是返回使用yield關鍵字,第二點是在連續邏輯內可以多次返回 這是yield的特點決定的,yield會記住函式執行的位

Python 學習筆記高階特性)

【關於切片】 #例如一個列表如下: L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] print('L=', L) #在沒有使用切片之前,取列表前三項的方法可能會是: _list = [] for i in range(3): _list.

python學習筆記(12):高階面向物件

一、__slots__和property   1.__slots__魔術函式動態的新增方法和屬性   2.直接暴露屬性的侷限性   3.使用get/set方法   4.利用@property簡化get/set方法   5.利用@property實現只讀屬性   6.裝飾器與property實現

Python學習筆記二(高階特性)

     1. 切片 #取一個list或tuple的部分元素是非常常見的操作,即輸出第0,1,2三個元素 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] # 方法一: print([L[0], L[1], L[2]])

Python學習筆記:檔案操作、類基礎、派生與繼承入門

#檔案操作open、close     開啟一個檔案供讀寫     file = open(file, mode=xx)          用完之後一定要記得關閉  

Python學習筆記高階特性

前言 最近在學習深度學習,已經跑出了幾個模型,但Pyhton的基礎不夠紮實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連線在這裡:廖雪峰 Python的相關介紹

Python學習筆記(一) —— 高階特性

寫學習筆記之前對python的基礎語法已經有了基本的瞭解,在此不冗餘的敘述。直接從其高階特性開始。python的學習材料或網站:高階特性切片切片是對list和tuple的常見操作。以list來舉例,先建立一個0-99的數列:L = list(range(100))前十個數:L

python學習筆記(四)——高階函式

一、函數語言程式設計     函式是Python內建支援的一種封裝,我們通過把大段程式碼拆成函式,通過一層一層的函式呼叫,可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函數語言程式設計(-- Functiona

Python學習筆記(2)位元操作、類、檔案操作

位元操作注意一: 適用範圍 Note that you can only do bitwise operations on an integer. Trying to do them on strings or floats will result in nonsensi

Python學習筆記:序列操作

1、通用序列操作 Python中所有序列都可以進行一些特定操作,包括索引(indexing)、分片(slicing)、序列相加(adding)、乘法(multiplying)、成員資格、長度、最小值和最大值。 1)索引 序列是Python中最基本的資料結構。序列

Python學習筆記-數據報表之Excel操作模塊

工作表 excel 字符串 python 利用Python操作Excel的模塊XlsxWriter,可以操作多個工作表的文字、數字、公式、圖表等。XlsxWriter模塊具有以下功能:100%兼容的Excel XLSX文件,支持Excel 2003、Excel 2007等版本;支持所有Ex