芒果db的基本操作
芒果數據庫
芒果數據庫是NOSQL的一種,是一種面向文檔的數據庫,介于結構化數據庫和非結構數據庫的一種,它的數據結構非常松散,也非常靈活
優點
-
面向文檔存儲(類JSON數據模式簡單而強大)
-
動態查詢
-
全索引支持,擴展到內部對象和內嵌數組
-
查詢記錄分析
-
快速,就地更新
-
高效存儲二進制大對象 (比如照片和視頻)
-
復制和故障切換支持
-
Auto- Sharding自動分片支持云級擴展性
-
MapReduce 支持復雜聚合
-
商業支持,培訓和咨詢
缺點
-
不支持事務(進行開發時需要注意,哪些功能需要使用數據庫提供的事務支持)
-
MongoDB占用空間過大 (不過這個確定對于目前快速下跌的硬盤價格來說,也不算什么缺點了)
-
MongoDB沒有如MySQL那樣成熟的維護工具,這對于開發和IT運營都是個值得注意的地方
-
在32位系統上,不支持大于2.5G的數據(很多操作系統都已經拋棄了32位版本,所以這個也算不上什么缺點了,3.4版本已經放棄支持32 位 x86平臺)
數據存儲階段
文件管理階段(.txt .doc .xls)
優點 : 使用簡單方便 數據能夠長期保存 可以存儲大量數據
缺點 : 數據一致性差 數據的查找修改不方便 數據冗余
數據庫管理階段
優點 : 數據組織結構化,降低冗余 提高增刪改查效率 方便擴展 方便程序調用,做自動化的處理 缺點 : 數據庫使用特定的語句操作,相對復雜
mysql 和 mongodb 概念比價
mysql mongodb 含義
database database 數據庫
table collection 表/集合
column field 字段/域
row document 記錄/文檔
index index 索引
操作
啟動
雙擊mongo.exe
查看當前系統中的數據庫
show dbs
系統數據庫: admin:存放用戶及其權限 local: 存儲本地數據 config:存儲分片信息
使用指定數據庫
use 庫名
創建庫
use str
剛創建不會成功,只有使用,才會成功
db.createCollection("class1")
刪除庫
db.dropDatabase()
刪除db代表的數據庫
創建集合
db.createCollection(collection_name)
創建一個class1的集合
例: db.createCollection("class1")
當向一個集合中插入數據的時候,如果這個集合不存在則會自動創建
例: db.class2.insert({"name":'Tom','age':17,'sex':'m'})
查看數據庫中的集合
方式一:show collections
方式二:show tables
刪除集合
db.collectionName.drop()
列: db.class1.drop()
集合的重命名
db.collectionName.renameCollection("new_name")
列:db.class2.renameCollection("class1")
文檔
mongodb中數據的組織形式--》文檔
芒果db文檔:以鍵值對形式組成的類似字典的數據結構
鍵:即文檔的域
鍵的命名規則: \1. utf-8字符串 \2. 不含有'\0' 通常不用 . $ \3. 一個文檔中的鍵不能重復
* 文檔中的鍵值對是有序的 * mongodb中數據嚴格區分大小寫
值:即文檔存儲的數據,支持bson數據
JavaScript ---》 json ---》bson
類型 值
整型 整數 布爾類型 true false 浮點型 小數 Array 數組 Timestamp 時間戳 Date 時間日期 Object 內部文檔 Null 空值 null String 字符串 Symbol 特殊字符串 Binary data 二進制字串 code 代碼 regex 正則表達式 ObjectId ObjectId字串
"_id" : ObjectId("5b503b7f38d0e992e1270560")
_id : 當在mongo代表中插入文檔時,如果不指定id則會自動添加這個域,作為主鍵。
ObjectId() 值是系統自動生成的不重復字串標識
24位 8位 文檔創建時間 6位 機器ID 4位 進程ID 6位 計數器
集合中的文檔:
集合中的文檔: \1. 集合中的文檔不一定有相同的域 \2. 集合中的文檔多少不一定相同 \3. 集合中的文檔,值的類型不一定相同
集合設計 \1. 集合中的文檔盡可能描述同一類數據 \2. 同一類數據不要過多分散在多個集合中存放 \3. 集合中文檔的結構層次不宜過多
插入文檔
插入單個文檔
db.collectionName.insert()
例:db.class0.insert({name:"HanMei",age:17,sex:'w'})
查看插入結果
db.class0.find()
* 插入數據時域名可以不加引號 * 查看插入結果 db.class.find() * id 為系統自動添加主鍵,如果自己寫id則為自己設定的值,但是仍然不可重復 * 一個集合中的文檔是有序的
插入多個文檔
db.collectionName.insert([{},{},{}])
例:db.class2.insert([{name:'阿寶',age:32},{name:'阿哲',age:31},{name:'阿蓉',age:26}])
查看插入結果
db.class2.find()
save() 插入文檔 save() 也可以用來插入多條數據 如果正常插入與insert相同 當插入指定_id值重復的數據時save()可以對原數據進行修改,但是insert()會報錯
使用save插入
db.collectionName.save()
例:db.class1.save({name:'Lily',age:13,sex:'w'})
查看插入結果
db.class1.find()
* 如果不加id域時用法同insert() * 如果加id,此_id值存在則save表示修改該文檔。
MongoDB 文檔型數據庫總結
創建數據庫: use database 刪除數據庫: db.dropDatabase()
創建集合: db.createCollection() db.collection.insert() 刪除集合: db.collection.drop() 重命名 : db.collection.renameCollection()
查看數據庫
查看數據庫: show dbs
查看集合
查看集合: show collections show tables
文檔
www.mongodb.com --> docs 查找文檔幫助
插入文檔 : insert() save()
獲取集合對象
db.getCollection('class1') ===》 db.class1
插入數據
db.getCollection('class1').insert({name:'Marry',age:16,sex:'w'})
查找操作
mysql : select ... from table where ....
mongo : db.collection.find(query,field)
查找所有內容 db.collection.find() ----> select * from table
find(query,field) 功能 : 查找數據 參數 : query: 篩選條件,相當于where子句 field: 選定要展示的域 返回值 : 返回查找到的文檔
query : 以鍵值對形式給出篩選條件 {name:'Lily'}
查找所有內容
db.collection.find(query,field)
查找所有
例: db.class1.find()
按條件查找
例:db.class1.find({name:'Lily'})
field : 以鍵值對的形式給出要展示(不展示)的域,域名為鍵,值為1表示展示,0表示不展示
* 如果某個域設置為0則表示不展示該域其他的均展示 * 如果某個域設置為1則表示展示該域其他的均不展示 * id必須設置為0才不會顯示 * 除了id其余設置的值必須相同
以鍵值對形式展示
db.class1.find({name:'Lily'},{_id:0,name:1,age:1})
db.class1.find({name:'Lily'},{_id:0,name:1})
db.class1.find({name:'Lily'},{_id:0})
0是該域不展示,其他均展示
1是該域展示,其他不展示
只查找第一條符合條件的文檔
findOne(query,field)
參數返回值同find()
例: db.class1.findOne({sex:'w'},{_id:0})
query 更多篩選功能
操作符:使用$符號標注的一個有特殊意義的字符串。用以表達一定的含義。比如 $lt 表示小于
比較操作符
$eq 等于 =
例:db.class1.find({age:{$eq:13}},{_id:0})
db.class1.find({age:13},{_id:0})
$lt 小于 <
例:db.class1.find({age:{$lt:15}},{_id:0})
* 字符串也可以比較大小
$lte 小于等于 <=
小于等于15
例:db.class1.find({age:{$lte:15}},{_id:0})
$gt 大于 >
大于15 db.class1.find({age:{$gt:15}},{_id:0})
$gte 大于等于 >=
大于等于15 db.class1.find({age:{$gte:15}},{_id:0})
$ne 不等于 !=
不等于13 db.class1.find({age:{$ne:13}},{_id:0})
* 如果某個文檔不存在查找的域,則不等于可以匹配到該文檔
$in 包含
年齡包含 在11,12,13,14的
db.class1.find({age:{$in:[11,12,13,14]}},{_id:0})
$nin 不包含
年齡不是13,14 db.class1.find({age:{$nin:[13,14]}},{_id:0})
邏輯操作符
query 逗號分隔的條件即為與關系
,表示關系
年齡大于13 小于16
db.class1.find({age:{$gt:13,$lt:16}},{_id:0})
年齡大于13且性別為女
db.class1.find({age:{$gt:13},sex:'w'},{_id:0})
$and 邏輯與
年齡大于13 并且姓名大于Lily
db.class1.find({$and:[{age:{$gt:13}},{name:{$lt:'Lily'}}]},{_id:0})
$or 邏輯或
年齡大于15或者為男生
$not 邏輯非
年齡不大于15
db.class1.find({age:{$not:{$gt:15}}},{_id:0})
$nor 既不也不
既不大于16 也不是女生
db.class1.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0})
條件混合
年齡大于16并且為男生 或者 年齡小于14
db.class1.find({$or:[{age:{$gt:16},sex:'m'},{age:{$lt:14}}]},{_id:0})
年齡大于16或者為女生 并且 姓名大于 Jame
db.class1.find({name:{$gt:'Jame'},$or:[{age:{$gt:16}},{sex:'w'}]},{_id:0})
數組
[1,2,3,4]
數組查找
查看數據中是否包含某一項
如果score數組中包含67即可
db.class3.find({score:67},{id:0}) db.class3.find({score:{$gt:90}},{id:0})
$all
查看數據中同時包含多項
同時包含64 75
db.class3.find({score:{$all:[64,75]}},{_id:0})
$size
通過數組元素個數查找
db.class3.find({score:{$size:3}},{_id:0})
$slice
取出數組的部分進行顯示 放在field中
顯示數組中前兩項 db.class3.find({},{id:0,score:{$slice:2}})
跳過第一項顯示后面一項 db.class3.find({},{id:0,score:{$slice:[1,1]}})
其他查找方法
$exists
判斷一個域是否存在
查找存在age域的文檔
db.class1.find({age:{$exists:true}},{_id:0} )
true 表示有這個域 false表示篩選無這個域
$mod
余數查找
查找除以2余數為1的 db.class1.find({age:{$mod:[2,1]}},{_id:0} )
$type
找出值為指定類型的文檔
查找age數據類型為1的文檔 db.class1.find({age:{$type:1}},{_id:0} )
具體數字和類型的匹配 Type Number Double 1 String 2 Object 3 Array 4 Binary data 5 ObjectId 7 Boolean 8 Date 9 Null 10 RE 11 Symbol 14 32-bit integer 16 Timestamp 17 64-bit integer 18
查找結果相關函數
distinct()
功能:查看集合某個域的取值范圍
查看集合中age域值的范圍 db.class1.distinct("age")
pretty()
功能: 格式化顯示查找結果
db.class1.find().pretty()
limit(n)
功能: 顯示查找結果的前n條
顯示查找結果的前三條 db.class1.find({},{_id:0}).limit(3)
skip(n)
功能 : 跳過前n條顯示
跳過前三條顯示后邊的內容 db.class1.find({},{_id:0}).skip(3)
count()
功能 : 計數統計
統計男生數量 db.class1.find({sex:'m'},{_id:0}).count()
sort({域:1/-1})
功能 : 對查找結果排序 參數 : 以鍵值對的形式給出 1 表示按照升序排序, -1表示降序排序
按照年齡升序 db.class1.find({},{_id:0}).sort({age:1})
復合排序:當第一排序項相同時比較第二排序項
db.class0.find({},{_id:0}).sort({age:1,name:1})
函數的連續調用 當函數返回文檔集合時還可以繼續調用函數
查找班級年齡最大的三個 db.class1.find({},{_id:0}).sort({age:-1}).limit(3)
文檔的刪除操作
delete from table where ...
db.collection.remove(query,justOne) 功能 : 刪除文檔 參數 : query 篩選要刪除的文檔 相當于where 用法同查找 justOne : 布爾值,默認為false 表示刪除所有。如果設置為true 只刪除第一條符合條件的文檔。
例子:db.class2.remove({name:"阿蓉"})
justOne為true則只刪除第一條符合條件的
例:db.class0.remove({age:17},true)
刪除集合中所有文檔
刪除class2中所有文檔 db.class2.remove({})
練習 :
\1. 創建數據庫 名字 grade use grade \2. 數據庫中創建集合 class \3. 集合中插入文檔,格式如下 {name:'zhang',age:10,sex:'m',hobby:['a','b']} age范圍 4-15 hobby 范圍 [draw dance sing pingpong basketball football running computer]
\4. 查找練習 查看班級所有人信息 db.class.find({},{_id:0})
查看班級年齡8歲的同學信息 db.class.find({age:8},{id:0}) 查看年齡大于10歲的學生信息 db.class.find({age:{$gt:10}},{id:0}) 查看年齡在8-11歲之間的學生信息 db.class.find({$and:[{age:{$gt:8}},{age:{$lt:11}}]},{_id:0})
查看年齡為9歲且為男生的學生 db.class.find({age:9,sex:'m'},{_id:0})
找到年齡小于7歲或大于12歲的學生 db.class.find({$or:[{age:{$lt:7}},age:{$gt:12}],{id:0}) 找到年齡為8歲或者11歲的學生 db.class.find({$or:[{age:8},{age:11}]},{id:0}) db.class.find({age:{$in:[8,11]}})
找到有兩項興趣愛好的學生 db.class.find({hebby:{$size:2}},{_id:0})
找到興趣中有draw的學生 db.class.find({hebby:draw},{_id:0})
找喜歡畫畫又喜歡跳舞的學生 db.class.find({hebby:{$all:['draw','dance']}})
統計興趣有三項的學生人數 db.class.find({hebby:{%size:3}}).count
找到本班年齡第二大的同學 db.class.sort({age:-1}).skip(1).limit(1)
查看本班學生興趣愛好涵蓋哪些方面 db.class.distinct('hebby')
找到年齡最大的三個同學 db.class.sort({age:-1}).limit(3)
\5. 刪除所有年齡大于12或者小于7歲的同學除非他的愛好有三項以上 db.class.remove({$and:[{$or:[{age:{$gt:12}},{age:{$lt:7}}]},{hebby:{$size:{$lt:3}}}]}
修改操作
update table set ... where ...
db.collection.update(query,update,upsert,multi) 功能 : 修改文檔 參數 : query : 篩選需要修改的文檔,相當where 用法同查找 update: 要修改什么內容 相當set。往往需要配合修改操作符 upsert:bool值 默認false 如果query的文檔不存在則不做操作 設置為true 則如果文檔不存在根據query和update內容插入新文檔 multi: bool值 默認false 如果篩選到多條文檔則只修改第一條。 設置為true則表示修改所有篩選到的文檔
e.g. 年齡修改為18 db.class0.update({name:'HanMei'},{$set:{age:18}})
e.g. 如果篩選內容不存在則插入 db.class0.update({name:'Jame'},{$set:{age:18}},true)
e.g. 如果匹配到多條,則修改所有 db.class0.update({sex:'w'},{$set:{name:'小芳'}},false,true)
第三天
復習 :
\1. 查找操作 find(query,field) findOne()
操作符 : 比較 $lt $lte $gt $gte $ne $eq $in $nin 邏輯 $and $or $not $nor
數組 $all $size
其他 $exists $mod $type
\2. 函數 : pretty() limit() skip() sort() count() 其他函數: distinct() getCollection()
\3. 刪除文檔 remove(query,justOne) remove({})
\4. 修改操作 update(query,update,upsert,multi)
==================================================
修改操作符
$set 修改一個域的值,或者增加一個域
e.g. 修改功能 如果該域不存在則增加這個域 db.class0.update({age:20},{$set:{name:'小薇'}})
$unset 刪除一個域
e.g. sex后面為空表示刪除一個域 db.class0.update({name:'Jame'},{$unset:{sex:''}})
$rename 修改一個域的名稱
e.g. 將sex域名修改為gender db.class0.update({},{$rename:{sex:'gender'}},false,true)
$setOnInsert 如果update執行了插入文檔操作,表示補充插入內容
e.g. 如果執行插入操作則將setOnInsert中內容也插入 db.class0.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true) 00 * 在update參數中可以同時寫多個修改器
$inc
加減修改器
e.g. 所有人年齡增加1 db.class0.update({},{$inc:{age:1}},false,true)
* $inc值可以是正數負數整數小數
$mul
乘法修改器
e.g. Tom年齡 乘以2 db.class0.update({name:'Tom'},{$mul:{age:2}})
* $mul值可以是正數負數整數小數
$max
指定了某個域值的下限,如果小于指定值則修改為指定值
e.g. 將年齡不到20的修改為20 db.class0.update({},{$max:{age:20}},false,true)
$min
指定了某個域值的上限,如果大于指定值則修改為指定值
e.g. 年齡大于25的修改為25 db.class0.update({},{$min:{age:25}},false,true)
數組修改器
$push 向數組中添加一項
e.g. db.class3.update({name:'小明'},{$push:{score:5}})
$pushAll 向數組中添加多項
e.g. db.class3.update({name:'小紅'},{$pushAll:{score:[5,10]}})
$pull 從數組中刪除一項
e.g. db.class3.update({name:'小紅'},{$pull:{score:10}})
*數組可以有重復值,如果刪除則會把所有指定的值都刪除
$pullAll 刪除數組中多項
e.g. db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}})
$each 對多個值逐一操作
e.g. db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})
$position 指定插入位置
e.g. 需要搭配$each使用,將數據從1號位置插入 db.class3.update({name:'小紅'},{$push:{score:{$each:[10],$position:1}}})
$sort 對數組進行排序
e.g. 和each一起使用,對數組score進行排序 db.class3.update({name:'小紅'},{$push:{score:{$each:[],$sort:1}}})
$pop 彈出一項
e.g. 1表示彈出最后一項 -1表示刪除第一項 db.class3.update({name:'小紅'},{$pop:{score:-1}})
$addToSet 向數組中添加一項,不能和已有的內容重復
e.g. 添加87,不能和已有數據重復 db.class3.update({name:'小紅'},{$addToSet:{score:87}})
時間類型
mongodb中存儲時間格式 : ISODate()
方法1 : new Date() 自動生成當前時間
e.g. db.class2.insert({title:'Python入門',date:new Date()})
方法2 : ISODate() 生成當前時間
e.g. db.class2.insert({title:'Python精通',date:ISODate()})
方法3 Date() 將生成的當前時間變為字符串存儲
e.g. db.class2.insert({title:'Python瘋狂',date:Date()})
ISODate()
功能 : 生成時間類型存儲 參數 : 參數指定時間 "2018-07-01 12:10:56" "20180701 12:10:56" "20180701"
e.g. db.class2.insert({title:'Python崩潰',date:ISODate("2018-07-01 01:12:12")})
時間戳
valueOf() 將時間轉換為時間戳
e.g. db.class2.insert({title:'Python放生',date:ISODate().valueOf()})
Null ----》 null
\1. 如果某個域存在卻沒有值,可以設置為null
e.g. db.class2.insert({title:'Python涅槃',price:null})
\2. 如果某個域不存在可以使用null匹配
e.g. 找到date域不存在的文檔 db.class2.find({date:null},{_id:0})
Object 內部文檔
文檔內某個域的值還是一個文檔,則這個文檔為內部文檔
* 當需要使用內部文檔某個域的時候,可以使用外部文檔 . 的方法引用內部文檔。但是注意此時需要加引號
e.g. db.class4.find({'book2.title':'python Web'},{_id:0})
e.g. db.class4.update({'book1.title':'python爬蟲'},{$set:{'book1.price':48.8}})
數組的下標引用
* 使用數組時,可以使用數組域 . 數組序列下標的方式引用數組的具體某一項
e.g. db.class3.find({'score.0':98},{_id:0})
e.g. db.class3.update({name:'小明'},{$set:{'score.0':100}})
查找結果的有序性
即可以對find的查找結果使用[]的方式引用具體某一條
e.g. db.class1.find({},{_id:0})[1]
練習 : 使用之前的grade數據庫
\1. 將小紅年齡修改為8歲,興趣愛好變為跳舞畫畫 {$set:{age:8,hobby:[‘draw’,'dance']}}
\2. 追加小明興趣愛好 唱歌 {$push:{hobby:'sing'}}
\3. 追加小王興趣愛好,吹牛,打籃球 {$pushAll:{hobby:['chuiniu','basketball']}}
\4. 小李興趣多了跑步唱歌,但是要確保和之前的不重復 {$addToSet:{hobby:{$each:['running','sing']}}}
\5. 班級所有人年齡加1 {$inc:{age:1}},false,true
\6. 刪除小明的sex屬性 {$unset:{sex:''}}
\7. 刪除小李的第一個愛好 {$pop:{hobby:-1}}
\8. 刪除小紅的興趣畫畫和唱歌 {$pullAll:{hobby:['draw','sing']}}
索引
指建立指定鍵值對及所在文檔中存儲位置的對照清單。使用索引可以方便我們快速查找,減少遍歷次數,提高查找效率。
mongodb創建索引
ensureIndex()
功能 : 創建索引 參數 : 索引域,索引類別和選項
e.g. 根據name 創建索引 db.class1.ensureIndex({name:1})
* 1表示正序 -1逆序
查看一個集合中的索引
db.class1.getIndexes()
* _id是系統自動創建的索引
自定義索引名稱
db.class1.ensureIndex({name:1},{name:'name_index'})
刪除索引
dropIndex()
功能 : 刪除索引 參數 : 要刪除的索引,可以是索引名稱或者索引鍵值對
e.g. db.class1.dropIndex('age_index') e.g. db.class1.dropIndex({name:-1})
dropIndexes() 刪除所有索引 除了_id
e.g. db.class1.dropIndexes()
索引類型
復合索引 根據多個域創建一個索引
e.g. db.class1.ensureIndex({name:1,age:-1})
數組和子文檔索引
如果對某個域創建索引,值為數組或者子文檔,則通過數組或子文檔進行查找時也是索引查找
覆蓋索引
查找返回的內容,僅僅是索引表存儲的內容,不需要再去原數據庫查找
唯一索引
創建索引時希望集合中創建索引的域的值均不重復
e.g. db.class1.ensureIndex({name:1},{unique:true})
* 創建唯一索引的域的值不可以重復
稀疏索引(間隙索引)
只針對有指定域的文檔創建索引表,如果某個文檔沒有該域則不做索引處理
e.g. 創建age域的稀疏索引 db.class1.ensureIndex({age:1},{sparse:true})
索引約束 \1. 當數據發生更新 ,索引也要隨之更新。影響插入,修改,刪除操作的效率 \2. 索引表也需要占有一定的磁盤空間
綜上 :當數據量比較小,或者需要頻繁的進行數據修改操作而不是查找操作的時候,不適合創建索引
聚合操作
對文檔的更高級的篩選整理統計
db.collection.aggregate() 功能 : 聚合函數,完成聚合操作 參數 : 聚合條件 ---》 聚合操作符
聚合操作符
$group 分組聚合 需要配合分組統計操作符使用 $sum : 求和 e.g. db.class1.aggregate({$group:{_id:'$sex', 分組 按sex內容分組 num: {$sum:1}}}) 自定義統計域 統計什么
e.g. 統計所有男生和女生的年齡之和 db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
$avg 求平均 e.g. 求每個性別的平均年齡 db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
$max 求最大值 e.g. 求每組年齡的最大值 db.class1.aggregate({$group:{_id:'$sex',max:{$max:'$age'}}})
$min 求最小值
e.g. 求每組年齡的最小值 db.class1.aggregate({$group:{_id:'$sex',min:{$min:'$age'}}})
$project 用于修改文檔的顯示效果
e.g. db.class1.aggregate({$project:{_id:0,sex:0}})
e.g. 指定顯示域名 db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match 過濾數據
e.g. 過濾年齡大于16的 db.class1.aggregate({$match:{age:{$gt:16}}})
作業 : 熟練mongodb增刪改查操作 熟練 索引操作
第四天
復習:
\1. 數據的修改 update(query,update,upsert,multi)
修改器 : $set $unset $rename $setOnInsert $inc $mul $max $min $push $pushAll $pull $pullAll $each $position $sort $addToSet $pop
時間類型 : new Date() ISODate() Date() valueOf()
null : 作為一個域的值,或者表示一個域不存在
內部文檔 :通過 . 獲取內部文檔某個域的值
索引操作: ensureIndex({},{}) dropIndex() dropIndexes() getIndexes()
聚合操作
aggregate()
聚合操作 $group $project $match $sum $avg $max $min **************
聚合操作
$limit 顯示前幾條文檔
e.g. 獲取數據的前兩個文檔 db.class1.aggregate({$limit:2})
$skip 跳過幾條文檔
e.g. 跳過前兩條文檔顯示后面內容 db.class1.aggregate({$skip:2})
$sort 排序
e.g. 按年齡升序排序 db.class1.aggregate({$sort:{age:1}})
聚合管道 : 將前一個聚合操作得到的結果,給后一個聚合操作繼續使用
db.collection.aggregate([聚合1,聚合2....])
e.g. $match ---> $project ---> $sort db.class1.aggregate([{$match:{sex:'m'}},{$project:{_id:0}},{$sort:{age:1}}])
e.g. $group ---> $match db.class1.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
練習: 增加分數域 score:{chinese:88,math:76,english:76}
1.學生按照性別分組,統計每組人數 aggregate({$group:{_id:'$sex',num:{$sum:1}}})
\2. 統計每名男生的語文分數 aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])
\3. 將所有女生按照英語成績降序排序 aggregate([{$match:{sex:'w'}},{$sort:{'score.englisth':-1}}])
固定集合
mongodb中可以創建大小固定的集合,稱之為固定集合
特點 : 插入速度快,順序查找速度快 能夠淘汰早期數據 可以控制集合大小
使用 : 臨時緩存 日志處理
db.createCollection(collection,{capped:true,size:10000,max:1000})
capped:true 表示創建固定集合 size : 表示集合的大小 bytes 4.0最小 4096 max : 表示最多存放多少文檔
e.g. db.createCollection('log',{capped:true,size:10,max:3})
文件存儲
文件存儲到數據庫方式
\1. 存儲路徑 將文件在本地的路徑以字符串形式存儲到數據庫
優點 : 節省數據庫空間 缺點 : 當數據庫或者文件位置發生變化時文件丟失。
\2. 存儲文件本身 以二進制方式將文件存儲到數據庫 優點:數據庫和文件綁定存在 缺點 : 占用空間大,結構化麻煩
mongodb存儲二進制文件
* GridFS方法存儲大文件 >16M為大文件 * 將文件轉化為二進制,進行插入 Binary data
GridFS方案解釋
\1. 在mongodb中一個數據庫創建兩個集合共同完成對文件的存儲 \2. fs.files 用來存儲文件的相關信息,為每一個文件創建一個文檔,存儲文件名、文件類型等信息 \3. fs.chunks 用來分塊存儲文件的實際內容
如何存儲 mongofiles -d dbname put file 數據庫 要存儲的文件
* 如果數據庫不存在自動創建
fs.files { "_id" : ObjectId("5b569b8969d72e103282f608"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-07-24T03:22:54.259Z"), "length" : 247759369, "md5" : "a94853f4f64b3e87bf98aea770855615", "filename" : "abc.mp4" }
fs.chunks { "_id" : ObjectId("5b569b8969d72e103282f61d"), "files_id" : ObjectId("5b569b8969d72e103282f608"), "n" : 20, "data" : BinData(0,"7Pa7M7M9nZt2bezsz272vbdm/7fhu672fwAAbZKbmR2S7Ndv/.....")}
* 對于同一個文件 fs.files中的_id值等于 fs.chunks中的files_id值
文件提取方法
mongofiles -d dbname get file
Grid的優缺點 優點 : 存儲方便,提供較好的命令支持 缺點 : 讀寫效率低
游標
通過一定的操作獲取返回結果的對象
var cursor = db.class1.find() cursor.hasNext() 判斷是否有next cursor.next() 獲取下一條數據
python操作mongodb
pymongo模塊 第三方模塊
安裝 sudo pip3 install pymongo
操作步驟 \1. 創建mongodb數據庫連接對象
conn = pymongo.MongoClient('localhost',27017)
\2. 得到數據庫對象
db = conn.stu
\3. 獲取集合對象
myset = db.class1
\4. 增刪改查,索引 ,聚合
調用各種myset的屬性函數
\5. 關閉數據庫連接 conn.close()
插入操作
insert() insert_many() insert_one() save()
查找操作
cursor = find() 返回一個結果游標
* 在pymongo中使用操作符的方法與mongo shell中相同,只需要轉變為字符串格式加上引號即可
cursor 的屬性函數
next() limit() skip() sort([('name',1),('age',-1)]) count()
* 使用了next或者for取游標后就不能使用limit sort操作了
find_one() 返回一個字典
更新操作
update(query,updata,upsert=False,multi=False) update_many() update_one()
刪除操作 remove(query,multi = True)
multi默認為True表示刪除所有篩選內容 如果設置為False則表示刪除一條
復合功能函數 find_one_and_delete()
索引操作 ensure_index() 創建索引 list_indexes() 查看索引 drop_index() 刪除索引 drop_indexes() 刪除所有索引
聚合操作 aggregate([]) 參數寫法和mongo shell中聚合相同 返回值 : 返回一個迭代游標 同find()
GridFS 程序提取
import gridfs
gridfs.GridFS(db)
插入二進制格式數據
import bson.binary
常用命令
> show dbs -- 查看數據庫列表
> use admin --創建admin數據庫,如果存在admin數據庫則使用admin數據庫
> db ---顯示當前使用的數據庫名稱
> db.getName() ---顯示當前使用的數據庫名稱
> db.dropDatabase() --刪當前使用的數據庫
> db.repairDatabase() --修復當前數據庫
> db.version() --當前數據庫版本
> db.getMongo() --查看當前數據庫的鏈接機器地址
> db.stats() 顯示當前數據庫狀態,包含數據庫名稱,集合個數,當前數據庫大小 ...
> db.getCollectionNames() --查看數據庫中有那些個集合(表)
> show collections --查看數據庫中有那些個集合(表)
> db.person.drop() --刪除當前集合(表)person
MongoDB預熱,簡單的增刪改
首先我先介紹一點MongoDB的基本概念
1、MongoDB是NoSQL中面向文檔的數據庫,他是介于關系型數據庫與非數據庫之間的數據庫產品。
2、MongoDB的文檔,相當于關系數據庫中的一行數據。
3、多個文檔組成一個集合(collection),集合相當于關系數據庫中的表
4、多個集合,組合在一起,就是一個數據庫
5、一個運行的MongoDB Server支持多個數據庫。
MongoDB中的插入Insert
首先打開cmd,輸入Mongo進入shell界面
輸入show dbs ,查看當前數據庫為local。然后創建數據庫,庫名為fristdb,輸入 use fristdb ,這樣就相當于創建啦數據庫。
note:
> db.people.insert({"name":"張龍豪","age",18}) 這一句由于{}里面的內容不是json結構的數據,不能插入數據庫表(集合)people中。
> db.people.insert({"name":"張龍豪","age":18}) 這樣文檔格式沒有錯誤,就插入成功,意思是在fristdb庫中插入people集合(表),文檔(行數據)為 {"name":"張龍豪","age":18}
> db.room.insert({"cmp":50,"tree":20}) 這一句又創建啦一個集合(表)插入文檔(行數據)為{"cmp":50,"tree":20}
MongoDB中的查看select---find
note:首先我在peple集合中插入啦2條數據,一條是18歲,一條是20歲。
> db.peple.find() 查出peple集合中的所有的文檔
> db.peple.find({"age":18}) 查出peple集合中年齡為18的一條文檔。
MongoDB中的修改update
Note:這個看圖,我就不羅嗦啦,update({},{}),前面一個是查詢條件,后面是修改后的數據文檔
MongoDB中的刪除delete--remove
Note:刪除后剩下一條張龍豪20的數據
MongoDB高級查詢詳細
前言
前幾篇,老玩家繞道即可,新手晚上閑著也是蛋疼,不如把命令敲一邊,這樣你就會對MongoDB有一定的掌握啦。如果沒有安裝MongoDB去看我的上一篇博客 MongoDB下載安裝與簡單增刪改查
前奏:啟動mongdb數據庫服務,并進入shell界面
> cmd
> cd C:\Program Files\MongoDB\bin --進入mongdb安裝文件的bin目錄下。
> net start mongoDB; --開啟mongoDB數據庫服務
> mongo --進入shell界面
首先我先介紹一點MongoDB的基本概念
1、MongoDB是NoSQL中面向文檔的數據庫,他是介于關系型數據庫與非數據庫之間的數據庫產品。
2、MongoDB的文檔,相當于關系數據庫中的一行數據。
3、多個文檔組成一個集合(collection),集合相當于關系數據庫中的表
4、多個集合,組合在一起,就是一個數據庫
5、一個運行的MongoDB Server支持多個數據庫。
常用命令
> show dbs -- 查看數據庫列表
> use admin --創建admin數據庫,如果存在admin數據庫則使用admin數據庫
> db ---顯示當前使用的數據庫名稱
> db.getName() ---顯示當前使用的數據庫名稱
> db.dropDatabase() --刪當前使用的數據庫
> db.repairDatabase() --修復當前數據庫
> db.version() --當前數據庫版本
> db.getMongo() --查看當前數據庫的鏈接機器地址
> db.stats() 顯示當前數據庫狀態,包含數據庫名稱,集合個數,當前數據庫大小 ...
> db.getCollectionNames() --查看數據庫中有那些個集合(表)
> show collections --查看數據庫中有那些個集合(表)
> db.person.drop() --刪除當前集合(表)person
MongoDB接入Javascrip風格語法,for,while,next,hasNext,forEach,toArray,findOne,limit
Note:
1、p={name:"張龍豪",age:18} 這個不是規范的json格式,使用這種類似javascript語法,對象會自動補全為規范的json格式{"name":"張龍豪","age":18}.
2、我在這里插入2條數據,一條是insert語法,一條是save語法,這里的insert與save是一樣的功能。
Note:這里我主要用啦一個for語法,循環插入啦4條數據,是不是有點小激動。哈哈,mongodb就是這么任性。
Note:這里是吧查詢出來的
1、while:作為程序員應該都不陌生他是個循環。
2、hasNext: cursor集合遍歷,是否還有數據。
3、printjson:輸出集合中的文檔
4、next:當前文檔,并向下遍歷。
Note:forEach循環輸入,必須定義一個函數供每個游標元素調用。
Note:游標也可以當作數組來用。
Note:游標轉換為真實的數組類型,使用。
Note:findOne,返回結果集中的第一條數據。limit(3),返回結果集中的前三條數據。
MongoDB中的高級查詢
面向文檔的NoSql數據庫重要解決的問題不是高性能的并發讀寫問題,而是保證海量數據存儲的同時,具有比一般數據庫更加良好的查詢性能。
Note:條件操作符號: > 、 < 、 >= 、<=
1、 $gt //大于 > ,$lt //小于 < ,$gte //大于等于 >= ,$lte //小于等于
2、{"filed":{$op,value}} //filed字段 ,$op條件操作符號,value值。
3、{"age":{$gt:1}} : person集合中年齡大于1的所有數據文檔
Note:$all匹配所有,類似t-sql中的in,但是t-sql中的in是滿足括號里面的任何一個都能出數據,而mongodb中的$all則必須滿足[]中的所有值。
1、{age:{$all:[7,9]}}:age數組中只要有7和9就滿足條件。如果只有7,沒有9則不符合條件。
Note:$exists判斷字段是否存在,(true/false)
1、{city:{$exists:true}}: 集合中存在city這個字段的數據
Note:$mod取模運算。
1、{age:{$mod:[7,6]}}:集合中模7余6的數據
Note:$ne不等于
Note:$in包含,$nin不包含。跟t-sql中的in,not in一樣。
1、{age:{$in:[10,11]}}:如果age是數組的話,只要數組包含in中條件的任何一條數據,都能被檢索出來。不是數組,則只要滿足in中的任何一個條件數據,也可以被檢索出來。
Note:數組元素個數。
1、{age:{$size:4}}:age數組元素個數為4的數據結果集。
Note:$not正則匹配,不包含以張開頭的數據。
Note:skip,limit,sort,count
1、skip(2):從數據集的第二條開始查詢
2、limit(2) : 依次查出2條數據。
3、sort({age:1}) : 1.正序查詢,-1倒敘查詢。
4、count():結果集總數。
分類: MongoDB
參考網站
芒果數據庫基本操作a1264716408的博客-CSDN博客芒果db查詢
MongoDB下載安裝與簡單增刪改查 - 張龍豪 - 博客園 (cnblogs.com)
MongoDB高級查詢詳細 - 張龍豪 - 博客園 (cnblogs.com)
MongoDB和java代碼結合
package com.liujinghe.demo.mongodb; ? import java.net.UnknownHostException; import java.util.Date; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.MongoClient; import com.mongodb.MongoException; ? public class Demo {public static void main(String[] args) { ?try {/**** Connect to MongoDB ****/// Since 2.10.0, uses MongoClient//(MongoClient類的實例)一個帶有內部連接池的MongoDB客戶端MongoClient mongo = new MongoClient("localhost", 27017); ?/**** Get database ****/// if database doesn't exists, MongoDB will create it for you//創建名為yihaomen的數據庫DB db = mongo.getDB("yihaomen"); ?/**** Get collection / table from 'yihaomen' ****/// if collection doesn't exists, MongoDB will create it for you//創建集合(表)DBCollection table = db.getCollection("crudCollection"); ?/**** Insert ****/// create a document to store key and value//創建BasicDBObject對象,將代碼對象轉換為json數據BasicDBObject document = new BasicDBObject();document.put("name", "yihaomen");document.put("age", 30);document.put("createdDate", new Date());//向芒果db中插入數據table.insert(document); ?/**** Find and display ****///創建BasicDBObject對象,將代碼對象轉換為json數據BasicDBObject searchQuery = new BasicDBObject();searchQuery.put("name", "yihaomen"); ?//從芒果db中查詢數據,返回結果放入DBCursorDBCursor cursor = table.find(searchQuery);while (cursor.hasNext()) {System.out.println(cursor.next());} ?/**** Update ****/// search document where name="yihaomen" and update it with new values//創建BasicDBObject對象,將代碼對象轉換為json數據//要修改的對象BasicDBObject query = new BasicDBObject();query.put("name", "yihaomen"); ?//修改后的對象BasicDBObject newDocument = new BasicDBObject();newDocument.put("name", "yihaomen-updated"); ?//修改條件BasicDBObject updateObj = new BasicDBObject();updateObj.put("$set", newDocument); ?//芒果db修改操作table.update(query, updateObj); ?/**** Find and display ****/BasicDBObject searchQuery2= new BasicDBObject().append("name", "yihaomen-updated"); ?DBCursor cursor2 = table.find(searchQuery2); ?while (cursor2.hasNext()) {System.out.println(cursor2.next());} ?/**** Remove test ****///刪除操作//BasicDBObject delDocument = new BasicDBObject();//newDocument.put("name", "yihaomen-updated");//table.remove(delDocument); ?/**** Done ****/System.out.println("Done");} ? // ? ? ? } catch (UnknownHostException e) { // ? ? ? ? ? e.printStackTrace(); // ? ? ? }catch (MongoException e) {e.printStackTrace();} ?} }總結
- 上一篇: code1928: 日期差值 技巧模拟
- 下一篇: BZOJ1050 [HAOI2006]旅