數據庫 MongoDB (芒果數據庫)
數據存儲階段
文件管理階段 (.txt .doc .xls)
優勢 : 數據能夠長期保存
能夠存儲大量的數據
使用簡單
缺點 : 數據一致性差
數據查找修改不方便
數據冗餘度可能比較大
數據庫管理階段
優勢 : 數據組織結構化下降了冗餘度
提升了增刪改查的效率
容易擴展
方便程序調用,作自動化處理
缺點 :須要使用sql 或者 其餘特定的語句,相對比較複雜
幾個概念
數據 : 可以輸入到計算機中並被識別處理的信息集合
數據結構 :研究一個數據集合中數據之間關係的
數據庫 : 按照數據結構,存儲管理數據的倉庫。數據庫是在數據庫 管理系統管理和控制下,在必定介質上的數據集合。
數據庫管理系統 :管理數據庫的軟件,用於創建和維護數據庫
數據庫系統 : 由數據庫和數據庫管理系統,開發工具等組成的集合
關係型數據庫
採用關係模型來組織數據結構的數據庫 (二維表)
Oracle DB2 SQLServer MySql SqLite(Python標準庫支持)
優勢 :容易理解,相似咱們常見的表格
使用方便,都是使用sql語句,SQL語句很是成熟
數據一致性高,冗餘度低,完整性好
技術成熟,可使用外部連接等比較複雜的操做
缺點 :不能很好的知足高併發需求,每次都須要進行sql語句的解析
針對含量數據的瞬間爆發讀寫性能不足,關係型數據庫內部每步操做都須要加鎖保證操做的原子性
數據擴展廣泛比非關係型困難
數據一致性高,有時會浪費大量空間
非關係型數據庫 (NoSql --> Not only Sql)
優勢 : 高併發,大數據讀寫能力強
支持分佈式,容易擴展
弱化了數據結構,下降了數據的一致性
缺點 : 通用性差,沒有像sql那樣一致的操做
操做靈活,容易混亂
沒有join,有的數據庫事務支持等操做
Nosql的使用狀況:
1. 數據一致性要求低
2. 數據庫併發處理要求高
3. 數據庫設計時對大小的估算不肯定,須要分佈拓展
4. 給定的數據比較容易創建起Nosql的模型
Nosql分類:
1. 鍵值型數據庫
Redis oracle BDB Tokyo
2. 列存儲數據庫
HBase
3. 文檔型數據庫
MongoDB CouchDB
4. 圖形數據庫
MongoDB(非關係型 --》文檔型數據庫)
1. 由c++編寫的數據庫管理系統
2. 支持很是豐富的增刪改查數據操做
3. 支持很是豐富的數據類型
4. 使用方便,便於部署,支持分佈,容易拓展
5. 支持衆多的編程語言接口 (python ruby c++ c# PHP)
MongoDB 安裝
自動安裝
sudo apt-get install mongodb
默認安裝位置 /var/lib/mongodb
配置文件 /etc/mongodb.conf
命令集 /usr/bin /usr/local/bin
手動安裝
1.下載MongoDB (開源)
www.mongodb.com ---》 Download ---》 community server
選擇合適版本下載
2. 選擇安裝目錄解壓 (/usr/local /opt)
tar解壓後獲得mongo文件夾
3. 將文件夾下的命令集目錄 (bin目錄)添加到環境變量
PATH=$PATH:/opt/mongo....../bin
export PATH
將以上兩句寫在 /etc/rc.local
4.重啓系統
mongodb 命令
設置數據庫存儲位置
mongod --dbpath 目錄
設置端口號
mongod --port 8888
*若是不設置則使用默認端口號 27017
mongo
進入mongo shell界面 mongodb的交互界面用來操做數據庫
退出 mongo shell : quit()
組成結構: 鍵值對 ---》 文檔 ----》集合 ----》 數據庫
----------------------------
ID | name | age
----------------------------
1 | Lily | 17
----------------------------
2 | Lucy | 18
----------------------------
{
"_id":ObjectId("abcd1234afhkasyr"),
"name":"Lily",
"age":17
},
{
"_id":ObjectId("abcd1234afasfsyr"),
"name":"Lucy",
"age":18
}
mysql 和 mongodb 概念對比
mysql mongo 含義
database database 數據庫
table collection 表/集合
column field 字段/域
row document 記錄/文檔
index index 索引
建立數據庫
use databasename
e.g.
建立一個叫 stu 的數據庫
use stu
* use實際功能是表示選擇使用哪一個數據庫,當這個數據庫不存在時即表示建立該數據庫
* 使用use後數據庫並不會立刻被建立,而是須要插入數據後數據庫纔會建立
查看數據庫
show dbs
數據庫名稱規則
1. 原則上是任意知足如下幾條的utf-8字符
2. 不能是空字符,不能含有空格' ' 點'.' '/' '\' '\0'
3. 習慣上使用英文小寫
4. 長度不超過64字節
5. 不能使用 admin local config 這樣的名字
admin : 存儲用戶
local : 存儲本地數據
config : 存儲分片配置信息
db : mongo系統全局變量 表明你當前正在使用的數據庫
db 默認爲test 若是插入數據即建立test數據庫
數據庫的備份和恢復
備份 mongodump -h dbhost -d dbname -o dbdir
e.g. mongodump -h 127.0.0.1 -d stu -o student
將本機下 stu 數據庫備份到 當前目錄的student文件夾中
會在student文件夾中自動生成一個stu文件夾則爲備份文件
恢復 mongorestore -h <dbhost>:<port> -d dbname <path>
e.g. mongorestore -h 127.0.0.1:27017 -d test student/stu
將student文件夾下的備份文件stu恢復到本機的test數據庫
數據庫的監測命令
mongostat
insert query update delete :每秒增查改刪的次數
getmore command 每秒運行命令次數
dirty used flushes 每秒操做磁盤的次數
vsize res 使用虛擬內存和物理內存
mongotop
監測每一個數據庫的讀寫時長
ns total read write
數據集合 總時長 讀時長 寫時長
刪除數據庫
db.dropDatabase()
刪除db所表明的數據庫
集合的建立
db.createCollection(collection_name)
e.g. db.createCollection("class2")
在當前數據庫下建立一個名字爲class2的集合
查看數據庫中集合
show tables
show collections
集合的命名規則:
1. 不能爲空字符串,不能有'\0'
2. 不能以 system.開頭 這是系統集合的保留前綴
3. 不能和保留字重複
建立集合2
當向一個集合中插入文檔時,若是該集合不存在則自動建立
db.collectionName.insert()
e.g. db.class0.insert({a:1})
若是class0不存在則會建立class0集合並插入該數據
刪除集合
db.collectionName.drop()
e.g. db.class0.drop()
刪除class0集合
集合重命名
db.collectionName.renameCollection('new_name')
e.g. db.class2.renameCollection('class0')
將class2重命名爲class0
文檔
mongodb 中文檔的組織形式
鍵值對組成文檔 -----》 相似Python中的字典
bson -----》 json -----》 JavaScript
mongodb 中文檔的數據組織形式爲bson格式,相似Python的字典,也是由鍵值對構成
文檔中鍵的命名規則 :
1. utf-8格式字符串
2. 不用有\0 習慣上不用 . 和 $
3. 以_開頭的多位保留鍵,自定義時通常不以_開頭
注意 : 文檔鍵值對是有序的
mongodb中嚴格區分大小寫
值 : mongodb的支持數據類型
支持的數據類型
類型 值
整型 整數
布爾類型 true false
浮點型 小數
Arrays 數組類型 [1,2,3]
Timestamp 時間戳
Date 時間日期
Object 內部文檔
Null 空值
Symbol 特殊字符
String 字符串
Binary data 二進制字串
code 代碼
regex 正則表達式
ObjectId ObjectId子串
ObjectId : 系統自動爲每一個文檔生成的不重複的主鍵
鍵名稱: _id
值 : ObjectId("5b03b823e64cb5d90e9c8f5c")
24位16進制數
8 文檔建立時間 6機器ID 4進程ID 6計數器
文檔中鍵 -----》 域/字段
文檔 ---------》 記錄
集合中文檔特色:
1. 集合中的文檔域不必定相同 ---》不保證數據一致性
2. 集合中的文檔結構不必定相同
集合設計原則:
1.集合中的文檔儘量描述的數據相似
2.同一類文檔放在相同的集合,不一樣的文檔分集合存放
3.層次的包裹不宜太多
插入文檔
db.collectionName.insert()
e.g.
db.class0.insert({name:'Lucy',age:16,sex:'w'})
* 看成爲文檔插入時鍵能夠不加引號
查看插入結果 db.class0.find()
插入多條文檔
db.collectionName.insert([{},{},{}])
e.g. db.class0.insert([{'name':'阿花',age:28},{name:'阿紅',age:26},{name:'阿彪',age:23}])
* _id 爲系統自動添加主鍵,若是本身寫_id域則會使用本身寫的值。可是該值仍不容許重複。
save 插入數據
db.collectionName.save()
e.g.
db.class0.save({_id:2,name:'八戒',age:17,sex:'m'})
* 在不加_id是使用同 insert
* 若是使用save插入的時候加了_id,則若是_id值不存在則正常插入,若是該值存在,則修改原來內容
* save沒法一次插入多個文檔
做業 : 練習mongodb的數據庫,集合建立刪除
mongodb 插入練習
關係型數據庫和非關係數據庫都有什麼特色?
mongodb的優勢在哪裏?
************************************************************次日
複習 :
數據庫建立刪除: use 數據庫名稱
db.dropDatabase()
集合的建立和刪除 db.createCollection('name')
db.collectionName.insert()
db.collectionName.drop() 刪除
db.collectionName.renameCollection() 重命名
數據庫的備份和恢復
mongodump (備份) mongorestore(恢復)
數據庫的監測
mongostat mongotop
數據庫配置
mongod --dbpath path --port 8888
數據的插入 : insert() save()
=====================================
db.collectionName 集合對象
獲取集合對象 : db.getCollection('collection_name')
e.g.
db.getCollection("class0").insert({name:'悟空',age:1700})
查找操做
select ... from tableName where .....
db.collectionName.find() ---> select * from tableName
find(query,field)
功能 : 查找全部符合條件的文檔
參數 : query : 篩選條件 至關於where字句
field : 展現的域 至關於select的展現部分
返回 : 返回全部查找到的內容
field 參數 : 選擇要展現的域 傳一組鍵值對
鍵表示域名
值表示是否顯示該域 0 表示不顯示 1 表示顯示
* 若是某個域給定0 則表示不顯示該域,其餘的域均顯示
若是某個域給定1 則表示顯示該域 ,其餘的域都不顯示
* _id 永遠默認爲顯示,除非設置爲0
* 除_id外其餘域 必須擁有相同的設置,全爲0或者全爲1
* 若是不寫該參數則表示顯示全部域內容
e.g. db.class0.find({},{_id:0,name:1,age:1})
query : 以鍵值對的形式給出查找條件
查找年齡 17
e.g. db.class0.find({age:17},{_id:0})
* 若是不寫第一個參數則表示查找全部內容
findOne()
功能參數和find() 徹底相同,只是只返回第一條查找到的文檔
e.g. db.class0.findOne({age:17},{_id:0})
query的更多用法
操做符: 使用$符號註明一個特殊字符串,表示必定的含義
e.g. $lt 表示 小於
比較操做符
$eq 等於
e.g. db.class0.find({age:{$eq:17}},{_id:0})
篩選年齡等於17的
=====》 db.class0.find({age:17},{_id:0})
$lt 小於 <
e.g. db.class0.find({age:{$lt:17}},{_id:0})
* mongo中字符串也能夠比較大小
$lte 小於等於 <=
e.g. db.class0.find({age:{$lte:17}},{_id:0})
$gt 大於 >
e.g. db.class0.find({age:{$gt:17}},{_id:0})
$gte 大於等於 >=
e.g. db.class0.find({age:{$gte:17}},{_id:0})
$ne 不等於 !=
e.g. db.class0.find({age:{$ne:17}},{_id:0})
* 若是一個文檔沒有這個age域則顯示爲不等於
$in 包含
e.g. db.class0.find({age:{$in:[16,17,18]}},{_id:0})
$nin 不包含
e.g. db.class0.find({age:{$nin:[16,17,18]}},{_id:0})
邏輯操做符
$and 邏輯與
年齡小於19 而且 性別爲男
db.class0.find({age:{$lt:19},sex:'m'},{_id:0})
年齡小於19 而且 大於15
db.class0.find({age:{$lt:19,$gt:15}},{_id:0})
e.g. db.class0.find({$and:[{age:17},{name:'Lei'}]})
$or 邏輯或
e.g.
db.class0.find({$or:[{age:{$lt:22}},{name:'悟空'}]},{_id:0})
db.class0.find({$or:[{age:{$lt:18}},{age:{$gt:30}}]},{_id:0})
$not 邏輯非
e.g. db.class0.find({age:{$not:{$eq:17}}},{_id:0})
$nor 既不也不 (表示列表集合中的條件都不具有)
db.class0.find({$nor:[{age:{$gt:18}},{sex:'m'}]},{_id:0})
條件混合
(年齡小於20 或者 姓名爲阿紅) 而且 性別爲女的人
db.class0.find({$and:[{$or:[{age:{$lt:20}},{name:'阿紅'}]},{sex:'w'}]},{_id:0})
年齡小於等於17 或者 (姓名大於Tom 而且 年齡大於100)
db.class0.find({$or:[{age:{$lte:17}},{name:{$gt:'Tom'},age:{$gt:100}}]},{_id:0})
數組查找 :
查看數組中包含某一項的
e.g. db.class1.find({hobby:'吃'},{_id:0})
$all
查找一個數組中同時包含多項的文檔
e.g. db.class1.find({hobby:{$all:['拍電影','代言']}},{_id:0})
查找hobby數組中既有拍電影,又有代言的文檔
$size
查找數組元素個數爲指定個數的文檔
e.g. db.class1.find({hobby:{$size:3}},{_id:0})
查找hobby數組中包含三項的文檔
數組切片顯示
$slice
對數組切片顯示
e.g.
db.class1.find({hobby:{$size:3}},{_id:0,hobby:{$slice:2}})
顯示數組的前兩項
e.g.
db.class1.find({hobby:{$size:3}},{_id:0,hobby:{$slice:[1,2]}})
跳過第一項,顯示後面兩項
其餘查找方法:
$exists
判斷一個域是否存在
e.g. 查找存在sex域的文檔
db.class0.find({sex:{$exists:true}},{_id:0})
e.g. 查找不存在sex域的文檔
db.class0.find({sex:{$exists:false}},{_id:0})
$mod
作除數餘數查找
e.g.
查找年齡 被2除餘1的文檔
db.class0.find({age:{$mod:[2,1]}},{_id:0})
$type
查找指定數據類型的文檔
e.g. 查找hobby中包含數據類型爲 2 的數據的文檔
db.class1.find({hobby:{$type:2}},{_id:0})
數據類型對照:
https://docs.mongodb.com/manual/reference/operator/query/type/
進一步的信息篩選
distinct()
功能 : 查看一個集合中某個域值的覆蓋範圍
e.g. 查看集合中age域的值都有哪些
db.class0.distinct('age')
pretty()
功能 : 將查詢結果格式化顯示
e.g. db.class0.find().pretty()
limit(n)
功能: 查詢結果顯示前 n條
e.g. 查詢結果顯示前3個
db.class0.find({},{_id:0}).limit(3)
skip(n)
功能 : 顯示時跳過前n條
e.g. 顯示時跳過前三條
db.class0.find({},{_id:0}).skip(3)
count()
功能 :對查找結果計數統計
e.g. 統計sex 爲 m的文檔數量
db.class0.find({sex:'m'},{_id:0}).count()
sort({鍵:1/-1})
功能 : 對查找結果排序
1 表示按照升序排列, -1 表示按照降序排列
對查找結果按照年齡升序排列
db.class0.find({age:{$exists:true}},{_id:0}).sort({age:1})
複合排序 : 當第一排序項相同的時候,按照第二排序項排序
db.class0.find({age:{$exists:true}},{_id:0}).sort({age:1,name:-1})
函數的連續使用
獲取集合中年齡最小的三個文檔
db.class0.find({},{_id:0}).sort({age:1}).limit(3)
刪除文檔
delete from tableName where ....
db.collectionName.remove(query,justOne)
功能 : 刪除指定的文檔
參數 : query : 篩選要刪除的文檔, 相似where子句
用法同 查找操做
justOne :布爾值 默認 false 表示刪除全部篩選數據
若是賦值爲true 則表示只刪除第一條複合的文檔
e.g.
db.class0.remove({$or:[{age:{$exists:false}},{age:{$gt:100}}]})
刪除第一個複合條件的文檔
db.class0.remove({sex:{$exists:false}},true)
刪除集合中全部文檔
db.collectionName.remove({})
練習:
1. 建立一個數據庫 名字grade
use grade
2. 數據庫中建立一個集合名字 class
3. 集合中插入若干數據 文檔格式以下
{name:'zhang',age;10,sex:'m',hobby:['a','b','c']}
hobby: draw sing dance basketball football pingpong
computer
db.class.insert([
{name:"zhang",age:10,sex:'m',hobby:['a','b','c']},
.....
])
4. 查找練習
查看班級全部人信息
find()
查看班級中年齡爲8歲的學生信息
find({age:8})
查看年齡大於10歲的學生信息
find({age:{$gt:10}})
查看年齡在 4---8歲之間的學生信息
find({age:{$gte:4,$lte:8}})
找到年齡爲6歲且爲男生的學生
find({age:6,sex:'m'})
找到年齡小於7歲或者大於10歲的學生
find({$or:[age:{$lt:7},age:{$gt:10}]})
找到年齡是8歲或者11歲的學生
find({age:{$in:[8,11]}})
找到興趣愛好有兩項的學生
find({hobby:{$size:2}})
找到興趣愛好有draw的學生
find({hobby:"draw"})
找到既喜歡畫畫又喜歡跳舞的學生
find({hobby:{$all:["draw","dance"]}})
統計愛好有三項的學生人數
find({hobby:{$size:3}}).count()
找出本班年齡第二大的學生
find().sort({age:-1}).skip(1).limit(1)
查看學生的興趣範圍
db.class.distinct('hobby')
將學生按年齡排序找到年齡最大的三個
find().sort({age:-1}).limit(3)
刪除全部 年級大於12或者小於4歲的學生
remove({$or:[{age:{$gt:12}},{age:{$lt:4}}]})
做業 : 複習 數據的查找 和刪除操做
mongo練習
*********************************************************
第三天
查找 find(query,field)
findOne()
操做符 : 比較 $lt $lte $gt $gte $eq $ne $in $nin
邏輯 $and $or $not $nor
數組 $all $size
其餘 $exists $type $mod
查找函數 : limit() skip() sort() count() pretty()
其餘函數 distinct() getCollection()
刪除 remove(query,justOne)
=======================================
修改數據
update tableName set ... where .....
db.collectionName.update(query,update,upsert,multi)
功能 : 修改一個文檔
參數 : query : 刪選要修改的文檔 至關於where子句
用法同查找
update : 將數據更新爲何內容 至關於set操做
須要使用修改器操做符
upsert : bool值 默認爲false 表示若是query的文檔不 存在則沒法修改
若是設置爲true 表示若是query的文檔不存在則根據query和update參數插入新的文檔
multi : bool值 默認爲false 若是有多條符合篩選條件 的文檔則只修改第一條
若是設置爲true 則修改全部符合條件的文檔
e.g. 將阿紅年齡改成24
db.class0.update({name:'阿紅'},{$set:{age:24}})
e.g. 若是篩選數據不存在則插入一個新的文檔
db.class0.update({name:'阿花'},{$set:{age:18,sex:'w'}},true)
e.g. 能夠同時修改多條匹配到的文檔
db.class0.update({sex:'w'},{$set:{age:20}},false,true)
修改器操做符
$set
修改一個域的值
增長一個域
e.g. db.class0.update({name:'阿紅'},{$set:{sex:'w'}})
$unset
刪除一個域
e.g. 刪除文檔的sex和age域 (後面數字習慣寫1,0 都表示刪除)
db.class0.update({name:'八戒'},{$unset:{sex:0,age:0}})
$rename
修改一個域的名稱
e.g. 修改全部的sex域爲gender
db.class0.update({},{$rename:{sex:'gender'}},false,true)
$setOnInsert
若是update操做插入新的文檔,則補充插入內容
e.g. 若是插入數據則同時插入sex和tel域內容
db.class0.update({name:'阿華'},{$set:{age:21},$setOnInsert:{sex:'m',tel:'123456'}},true)
$inc
加減修改器
e.g. 年齡減2
db.class0.update({age:{$lt:18}},{$inc:{age:-2}},false,true)
* $inc 可加正數 負數 小數均可以
$mul
乘法修改器
e.g.
db.class0.update({name:'阿華'},{$mul:{age:-0.5}})
* $mul 可乘以正數 負數 小數均可以
$min
設定最小值 : 若是篩選的文檔指定的域值小於min值則不修改,若是大於min值則改成min值
e.g.
db.class0.update({},{$min:{age:19}},false,true)
$max
設置最大值 : 若是篩選的文檔指定至於大於max值則不變,若是小於max值則修改成max值
e.g.
db.class0.update({},{$max:{age:20}},false,true)
數組修改器
$push 向數組中添加一項
e.g.
db.class1.update({name:"Abby"},{$push:{score:30}})
$pushAll 向數組中添加多項
e.g.
db.class1.update({name:"Jame"},{$pushAll:{score:[10,20]}})
$each 逐個操做
e.g. 利用each添加多項
db.class1.update({name:"Lily"},{$push:{score:{$each:[10,5]}}})
$position
選擇數據位置進行操做 必須和each合用
e.g.
db.class1.update({name:"Lucy"},{$push:{score:{$each:[10,10],$position:1}}})
$sort
對數組進行排序 必須和each合用
e.g.
db.class1.update({name:"Lily"},{$push:{score:{$each:[],$sort:1}}})
$pull 從數組中刪除一個元素
e.g.
db.class1.update({name:'Lucy'},{$pull:{score:10}})
$pullAll 從數組中刪除多個元素
e.g.
db.class1.update({name:'Jame'},{$pullAll:{score:[10,20]}})
$pop 彈出數組中的一項
e.g.
db.class1.update({name:'Lily'},{$pop:{score:-1}})
* -1表示彈出數組中的第一項 1 表示彈出最後一項
$addToSet 向數組中插入一個元素,可是該元素不能和其餘元素重複
e.g. 若是已經存在66則沒法插入,若是不存在則插入66
db.class1.update({name:'Lily'},{$addToSet:{score:66}})
數據類型補充
時間類型
mongo中存儲時間的格式 :ISODate
方法1 自動生成當前時間
db.class2.insert({title:'Python入門',date:new Date()})
方法2 生成當前時間
db.class2.insert({title:'Python精通',date:ISODate()})
方法3 將生成時間變爲字符串存儲
db.class2.insert({title:'Python AI',date:Date()})
指定時間的轉換
ISOData()
功能 : 生成mongo時間類型
參數 : 若是不加參數則生成當前時間
參數格式 "2018-11-11 11:11:11"
"20180101 11:11:11"
"20181102"
e.g.
db.class2.insert({title:'Python 爬蟲',date:ISODate("20180101 11:11:11")})
時間戳獲取
e.g.
db.class2.insert({title:'PythonWeb',date:ISODate().valueOf()})
null
1. 若是某個域存在卻沒有值能夠設置爲null
e.g. db.class2.insert({title:'Python 祕籍',price:null})
2.表示某個域不存在能夠經過null進行匹配
e.g. db.class2.find({date:null},{_id:0})
能夠查找到date不存在的文檔
Object類型 (值是一個文檔)
*當使用外層文檔引用內部文檔的時候能夠用用 . 的方法引用
在使用時須要加上引號
e.g.
db.class2.find({'publication.publisher':'人民教育'},{_id:0})
e.g.
db.class2.update({title:'Python數據'},{$set:{'publication.price':58.8}})
數組的下標引用
使用一個數組時,可使用 .序列下標 的方式使用數組具體的某一項。一樣須要用引號
e.g. db.class1.update({name:'Lily'},{$set:{'score.0':60}})
e.g. db.class1.find({'score.0':{$gt:90}})
文檔查找結果的有序性
能夠經過[]取查找結果序列的某一項
db.class1.find({},{_id:0})[1]
練習 :
使用以前的grade數據庫
1. 將小紅的年齡變爲8歲 興趣愛好變爲 跳舞 畫畫
{$set:{age:8,hobby:['dance','draw']}}
2. 追加小明興趣愛好 唱歌
{$push:{hobby:'sing'}}
3. 小王興趣愛好增長 吹牛 打籃球
{$pushAll:{hobby:['吹牛','basketball']}}
4. 小李增長愛好,跑步和唱歌,可是不要和之前的重複
{$addToSet:{hobby:{$each:['running','sing']}}}
5. 該班全部同窗年齡加1
update({},{$inc:{age:1}},false,true)
6. 刪除小明的sex屬性
{$unset:{sex:0}}
7. 刪除小李興趣中的第一項
{$pop:{hobby:-1}}
8. 將小紅興趣中的畫畫愛好刪除
{$pull:{hobby:'draw'}}
索引
指的是創建指定鍵值及所在文檔中存儲位置的對照清單。使用索引能夠方便咱們進行快速查找,減小遍歷次數,提升查找效率
mongo中如何建立索引
ensureIndex()
功能 : 建立索引
參數 : 索引類別,索引選項
e.g.
db.class0.ensureIndex({'name':1})
* 1表示爲該域建立正向索引,-1 表示逆向索引
* _id 域會自動建立索引
查看一個集合中的索引
db.class0.getIndexes()
刪除索引
dropIndex()
功能 : 刪除索引
參數 : 刪除索引的名稱
e.g. 能夠經過索引名稱或者索引鍵值對刪除
db.class0.dropIndex('name_1')
db.class0.dropIndex({name:1})
dropIndexes()
功能 : 刪除全部索引
e.g. db.class0.dropIndexes()
索引類型
複合索引
根據多個域建立一個索引
db.class0.ensureIndex({name:1,age:-1})
數組索引
若是對某個數組域建立索引,那麼表示對數組中的每一個值均建立了索引,經過數組中單個值查詢,也是索引查詢
db.class1.ensureIndex({'score':1})
子文檔索引
若是對一個域建立索引,值是一個文檔則子文檔也會同時造成索引
若是對子文檔某一個域進行索引建立,則只有經過子文檔中的該域查找時爲索引查找
e.g.
db.class2.ensureIndex({'publication.pulisher':1})
覆蓋索引
查找時只獲取索引項的內容,而沒必要去獲取原數據中的其餘內容,這樣就不去鏈接原來的數據直接返回便可
e.g. name爲索引項,顯示也只要name域
db.class0.find({name:'Lily'},{_id:0,name:1})
惟一索引
建立索引時但願索引域的值均不相同,也能夠據此限制一個域的值
e.g.
db.class0.ensureIndex({name:1},{'unique':true})
*當對某個域建立了惟一索引後,即不容許在插入相同的值的文檔
稀疏索引(間隙索引)
只針對有指定域的文檔建立索引表,沒有該域的文檔,不會插入到索引表中
e.g.
db.class2.ensureIndex({'date':1},{sparse:true})
索引約束 :
1.影響數據的插入,刪除,修改操做。當數據發生改變時,索引表必須同步更新
2.索引也是須要佔用必定的空間資源
綜上 : 當數據庫大量的操做是插入,修改,刪除操做,而非查詢操做時,不適合建立索引。數據量比較小時,考慮到空間成本也不適合建立索引。即便適合建立索引的狀況,也不是索引越多越好。
聚合
多數據文檔進行整理統計
db.collectionName.aggregate()
功能 : 聚合函數,配合聚合條件進行數據整理統計
參數 : 聚合條件
聚合操做符
$group 分組 和分組操做符配合使用肯定按什麼分組
++++++++++++++++++++++++++++++++++
分組操做符 (和$group配合)
$sum 求和
統計每組個數
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
聚合 分組 按gender分組 統計結果名
統計每組年齡和
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}})
$avg 求平均數
求平均年齡
db.class0.aggregate({$group:{_id:'$gender',num:{$avg:'$age'}}})
$min 求最小值
求每組姓名的最小值
db.class0.aggregate({$group:{_id:'$gender',name:{$min:'$name'}}})
$max
求每組姓名的最大值
db.class0.aggregate({$group:{_id:'$gender',name:{$max:'$name'}}})
$first
返回每組第一個文檔指定域值
db.class0.aggregate({$group:{_id:'$gender',name:{$first:'$name'}}})
$last
返回每組最後一個文檔指定域值
db.class0.aggregate({$group:{_id:'$gender',name:{$last:'$name'}}})
+++++++++++++++++++++++++++++++++++
$project
用於修飾文檔的顯示結構
e.g.
db.class0.aggregate({$project:{_id:0,name:1,age:1}})
e.g.
db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match 過濾數據
操做符的值同find的query
db.class0.aggregate({$match:{name:{$gt:'Tom'}}})
$skip 跳過前幾條文檔
db.class0.aggregate({$skip:2})
$limit 顯示幾條文檔
db.class0.aggregate({$limit:2})
$sort 排序
db.class0.aggregate({$sort:{name:1}})
聚合管道
將前一個聚合操做的結果給下一個聚合操做繼續執行
db.collectionName.aggregate([聚合1,聚合2,.....])
e.g. match---> project ---> sort
db.class0.aggregate([{$match:{name:{$gt:'Tom'}}},{$project:{_id:0,name:1,age:1}},{$sort:{name:-1}}])
e.g. group ---> match
db.class0.aggregate([{$group:{_id:'$gender',num:{$sum:1}}},{$match:{$nor:[{_id:'m'},{_id:'w'}]}}])
做業練習 :
使用以前的grade數據庫
增長分數域 score:{'chinese':88,'english':78,'math':98}
1. 按照性別分組統計每組人數
aggregate({$group:{_id:'$sex',num:{$sum:1}}})
2. 按照姓名分組,過濾出有重名的同窗
aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
3. 統計每名男生的語文成績
aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])
4. 將女生按照英語分數降序排列
aggregate([{$match:{sex:'w'}},{$sort:{'score.english':-1}}])
******************************************************
第四天
修改
update(query,update,upsert,multi)
修改器 : $set $unset $rename $setOnInsert $inc $mul
$min $max
$push $pushAll $each $pull $pullAll $position
$pop $addToSet $sort
數據類型 Date() ISODate() valueOf()
null 的使用
Object :經過 . 取內部文檔
經過 . 取數組索引
索引建立 ensureIndex()
聚合操做 aggregate()
聚合操做符 $group $match $project $limit $skip $sort
========================================================
固定集合
mongo中能夠建立大小固定的集合,稱之爲固定集合,固定集合的性能出色,適用於不少場景
好比 : 日誌處理, 臨時緩存
特色 : 插入速度快
順序查詢速度快
可以淘汰早期數據
能夠控制集合空間
建立:
db.createCollection(collectionName,{capped:true,size:10000,max:1000})
size :設置固定集合的大小 kb
max : 最多能容納多少文檔
e.g.
建立一個最多包含三條文檔的集合
db.createCollection('log',{capped:true,size:10,max:3})
文件存儲
數據庫存儲文件的方式
1. 在數據庫中以字符串的方式存儲文件在本地的路徑
優勢 : 節省數據庫空間
缺點 : 當數據庫或者文件位置發生變化即須要相應修改數據庫內容
2. 將文件已二進制數據的方式存放在數據庫裏
優勢:文件存入數據庫,數據庫在,文件即不會丟失
缺點: 當文件較大時,數據庫空間佔用大,提取困難
mongo中 使用GridFS方法 大文件存儲
GridFS : 是mongodb中大文件存儲的一種方案,mongo中認爲大於 16M的文件爲大文件
方案解釋:
在mongodb數據庫中 建立兩個集合 共同完成對文件的存儲
fs.files : 存儲文件的相關信息,好比:文件名 文件類型
fs.chunks : 實際存儲文件內容,以二進制方式分塊存儲。將大文件分爲多個小塊,每塊佔一個空間
mongofiles -d dbname put file
數據庫 要存儲的文件
*若是數據庫不存在則自動建立
fs.files
{ "_id" : ObjectId("5b0770c169d72e1e3a6eebda"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-05-25T02:11:13.986Z"), "length" : 8313457, "md5" : "4b39deb86dcb6ece44ef52a69dcd6e1a", "filename" : "xly.zip" }
fs.chunks
{ "_id" : ObjectId("5b0770c169d72e1e3a6eebee"), "files_id" : ObjectId("5b0770c169d72e1e3a6eebda"), "n" : 19, "data" : BinData(0,"wGTrj3......)}
獲取數據庫中文件
mongofiles -d grid get xly.zip
優缺點 :
優勢 : 存儲方便,方便數據庫移植,對文件個數沒有太多限制
缺點 : 讀寫效率低
遊標
爲何使用遊標
1. 防止網絡擁塞,形成數據傳輸慢
2. 提升用戶解析體驗,能夠後端解析
var cursor = db.class0.find() 建立遊標
cursor.hasNext() 查看是否有下一個數據
cursor.next() 獲取下一個數據
經過Python 操做mongodb數據庫
Python ---》 mongodb編程接口 pymongo
安裝
sudo pip3 install pymongo
操做步驟
1. 建立mongo數據庫的連接對象
conn = MongoClient('localhost',27017)
2. 生成數據庫對象
db = conn.stu
3. 生成集合對象
my_set = db.class0
4. 增刪改差索引聚合操做
插入數據 insert() insert_many() insert_one()
save()
刪除數據
remove({},multi = True)
multi 默認爲True 表示刪除全部符合條件的數據
設置爲False 表示只刪除一條
數據查找
find()
功能 : 查找數據庫內容
參數 : 同 mongo shell find()
返回值 : 返回一個遊標 ---》 迭代器
cursor 可迭代對象屬性函數
next()
count()
limit()
skip()
sort()
mongoshell ---> sort({'name':1})
pymongo ---> sort([('name',1)])
* 進行排序時遊標要確保沒有被訪問過
find_one()
返回值是一個字典
修改操做
update()
參數和mongoshell 中 update相同
update_many() :匹配到多個文檔時所有修改
update_one() : 只修改匹配到的第一條文檔
* 變成中mongo的數據類型null 能夠用Python中的 None替代
索引
建立索引
ensure_index()
create_index()
create_indexes() 建立多個索引
查看集合中的索引
list_indexes()
刪除索引
drop_index() 刪除某一個索引
drop_indexes() 刪除全部索引
聚合操做
aggregate([])
參數 : 與mongoshell中聚合參數寫法一致
返回值 : 迭代器 同find的返回值