[后端開發(fā)]MongoDB學習筆記

1.0 基初知識

????????在關(guān)系數(shù)據(jù)庫會產(chǎn)生一些例如表連接等操作及舍,這樣會大大降低系統(tǒng)的性能宿崭。而在當前很多應(yīng)用場景下對性能的要求遠遠強于傳統(tǒng)數(shù)據(jù)庫關(guān)注的點穿香,NoSQL(Not only SQL)就是為了解決大規(guī)模數(shù)據(jù)與多樣數(shù)據(jù)種類等問題,尤其是其中大數(shù)據(jù)的相關(guān)問題又憨。

1.0.1 NoSQL特點
  • 1虾啦、數(shù)據(jù)模型比較簡單蛉加;
  • 2蚜枢、對數(shù)據(jù)庫性能要求較高缸逃;
  • 3针饥、不需要高度的數(shù)據(jù)一致性;
  • 4需频、對于給定key丁眼,比較容易映射復雜值的環(huán)境
1.0.2 應(yīng)用場景
  • 1、對數(shù)據(jù)庫高并發(fā)讀寫的需求
  • 2昭殉、對海量數(shù)據(jù)的高效率存儲和訪問的需求
  • 3苞七、對數(shù)據(jù)庫的高可擴展性和高可用性的需求

2.0 MongoDB基礎(chǔ)認識

????????MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當中功能最豐富挪丢,最像關(guān)系數(shù)據(jù)庫的蹂风。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式乾蓬,因此可以存儲比較復雜的數(shù)據(jù)類型惠啄。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言任内,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能撵渡,而且還支持對數(shù)據(jù)建立索引。它的特點是高性能死嗦、易部署趋距、易使用,存儲數(shù)據(jù)非常方便越除。

2.0.1 數(shù)據(jù)庫對比
MongoDB MySQL
數(shù)據(jù)庫 數(shù)據(jù)庫
集合(Collection)
文檔(Document)

3.0 基礎(chǔ)使用

3.0.1 數(shù)據(jù)庫操作
use admin db.createUser({ user:'admin', pwd:'123456', roles:[{role:'root',db:'admin'}] })
mongo admin -u 用戶名 -p 密碼
show  dbs//查看數(shù)據(jù)庫
show collections//查看數(shù)據(jù)庫下有哪些collections
show  <collection_name>//查看具體的collection內(nèi)容
db.dropDatabase();//刪除當前所在的數(shù)據(jù)庫
db.auth("admin","password");密碼認證
3.0.2 集合(Collections)操作

數(shù)據(jù)庫中不能直接插入數(shù)據(jù)节腐,只能往集合(collections)中插入數(shù)據(jù)

db.集合名.insert({})//自動創(chuàng)建未創(chuàng)建過的集合
db.集合名.drop()//刪掉集合
3.0.3 數(shù)據(jù)查找
db.集合名.insert({})//數(shù)據(jù)插入
db.集合名.find({})//查找當前集合所有數(shù)據(jù)
db.集合名.distinct("過濾字段")//過濾掉字段中的相同數(shù)據(jù)
db.集合名.find({"字段名":"具體值"})//篩選等于具體值的數(shù)據(jù)
db.集合名.find({"字段名":{$gt:具體值}})//篩選大于具體指的數(shù)據(jù)
db.集合名.find({"字段名":{$lt:具體值}})//篩選小于具體指的數(shù)據(jù)
db.集合名.find({"字段名":{$gte:具體值}})//篩選大于等于具體指的數(shù)據(jù)
db.集合名.find({"字段名":{$gt:具體值1,$lt}})//篩選大于具體指1的數(shù)據(jù)摘盆,小于具體值2的數(shù)據(jù)
db.集合名.find({"字段名",/關(guān)鍵字/})//模糊查找翼雀,查找包含關(guān)鍵字的數(shù)據(jù)
db.集合名.find({"字段名",/^xin$/})//查找name開頭結(jié)尾是"xin"的數(shù)據(jù)
//**提取指定列**
db.集合.find({},{name:1,age:1})//0,1可以用true和false替代
//**復合查找**
db.集合.find({age:$lte:25},{name:1,age:1})
db.集合名.find({}).sort(字段名:順序值)//-1表示降序,1表示升序
db.集合名.find({}).limit(數(shù)據(jù)長度)//查詢前幾條數(shù)據(jù)
db.集合名.find({}).skip(跳過的數(shù)據(jù)長度值)//查找第幾條數(shù)據(jù)之后的所有數(shù)據(jù)
db.集合名.find({}).limit(數(shù)值1).skip(數(shù)值2)//查找數(shù)值1中的前數(shù)值2之后的數(shù)據(jù)//分頁查找
db.集合名.find({$or:[{age:11},{age:22}]})//與查找
db.集合名.findOne({})//查詢第一條數(shù)據(jù)
db.集合名.find({age:{$lte:25}}).count()//查找年齡大于25的數(shù)量
db.集合名.find({}).limit(25).count(true)//返回限制之后的數(shù)據(jù)量

提取指定列:除了 _id 你不能在一個對象中同時指定 0 和 1骡澈,如果你設(shè)置了一個字段為 0锅纺,則其他都為 1,反之亦然肋殴。
復合查找囤锉,查找age小于等于25的數(shù)據(jù),并對這些數(shù)據(jù)提取出name护锤,和age字段顯示

3.0.4 數(shù)據(jù)更新
db.集合名.updateOne({數(shù)據(jù)項:數(shù)據(jù)值}官地,{$set:{修改項:修改值}})//默認只修改第一個document
db.集合名.replaceOne({數(shù)據(jù)項:數(shù)據(jù)值},{$set:{修改項:修改值}})//替換單個數(shù)據(jù)
 db.集合.updateMany({name:/g$/},{$set:{name:"long"}})//更新多個
db.集合名.update({數(shù)據(jù)項:數(shù)據(jù)值},{$set:{數(shù)據(jù)項:數(shù)據(jù)值}},{multi:true})//修改所有匹配項
//更新或替換與指定過濾器匹配的單個文檔,或更新與指定過濾器匹配的所有文
db.集合名.update({數(shù)據(jù)項:數(shù)據(jù)值}烙懦,{$set:{修改項:修改值}})檔驱入。

3.0.5 數(shù)據(jù)刪除
db.集合名.deleteOne()
db.集合名.deleteMany()
3.0.5 數(shù)據(jù)插入
db.COLLECTION_NAME.insert(document)

4.0 數(shù)據(jù)類型(Bson Types)

A serialization format used to store documents and make remote procedure calls in MongoDB. “BSON” is a portmanteau of the words “binary” and “JSON”. Think of BSON as a binary representation of JSON (JavaScript Object Notation) documents. See BSON Types and MongoDB Extended JSON.

Type Number Alias Notes
Double 1 “double”
String 2 “string”
Object 3 “object”
Array 4 “array”
Binary data 5 “binData”
ObjectId 7 “objectId”
Boolean 8 “bool”
Date 9 “date”
Null 10 “null”
Regular Expression 11 “regex”
JavaScript 13 “javascript”
JavaScript (with scope) 15 “javascriptWithScope”
32-bit integer 16 “int”
Timestamp 17 “timestamp”
64-bit integer 18 “l(fā)ong”
Decimal128 19 “decimal” New in version 3.4.
Min key -1 “minKey”
Max key 127 “maxKey”

可以使用$type操作符根據(jù)上表中列出的BSON數(shù)據(jù)類型從文檔中查詢數(shù)據(jù)。

eg: db.test.find({age:{$type:16}}) //16是表格中int值的代表

5.0 數(shù)據(jù)操作符

5.0.1 比較運算符
Name Description 操作
$eq 等于 db.test.find({age:{$eq:25}})
$gt 大于 db.test.find({age:{$gt:25}})
$gte 大于等于 db.test.find({age:{$gte:25}})
$in 匹配在數(shù)組中的任意值 db.test.find({age:{$in:[25,26]}})
$lt 小于 db.test.find({age:{$lt:25}})
$lte 小于等于 db.test.find({age:{$lte:25}})
$ne 不等于 db.test.find({age:{$ne:25}})
$nin 匹配不在數(shù)組中的值 db.test.find({age:{$nin:[25,26]}})
5.0.2 元素匹配運算符
Name Description 操作
`$exists 查詢所有指定字段存在的數(shù)據(jù) db.users.find({age: {$exists: true}});
$type 匹配類型 db.users.find({age:{$type:6}})
5.0.3 邏輯運算符
Name Description 操作
$and { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
$not { field: { $not: { <operator-expression> } } }
$nor 或非 { $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
$or { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
db.inventory.find( { 
  $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] 
} )
//等價于
db.inventory.find( { price: { $ne: 1.99, $exists: true } } )

5.0.4 評估運算符
Name Description 操作
$expr 允許在查詢語言中使用聚合表達式 { $expr: { <expression> } }
$jsonSchema 匹配符合與給定的json綱要的文檔 { $jsonSchema: <schema> }
$mod 取模運算 { field: { $mod: [ 被除數(shù), 余數(shù) ] } }
$regex 正則 { <field>: { $regex: /pattern/<options> } }
$text 文本對帶有文本索引的字段內(nèi)容執(zhí)行文本搜索 {$text:{$search: <string>,$language: <string>,$caseSensitive: <boolean>,$diacriticSensitive: <boolean>}}
$where 匹配滿足javascript表達式的文檔
5.0.5 數(shù)組操作運算符
Name Description 操作
$all 匹配所有 { <field>: { $all: [ <value1> , <value2> ... ] } }
$elemMatch 匹配內(nèi)嵌文檔或數(shù)組中的部分field { <field>: { $elemMatch: { <query1>, <query2>, ... } } }
$size 匹配數(shù)組長度為指定大小的文檔 db.inventory.find( { tags: { $size: 1 } )

與$in 只需滿足某一個值即可,而$all 必須滿足數(shù)組]內(nèi)的所有值

//獲取document中arrs數(shù)組中數(shù)據(jù)值大于25小于50的數(shù)組元素
db.test.find({arrs:{$elelMatch:{$gte:25,$lte:50}}})
5.0.6 字段更新運算符
Name Description 操作
$inc 將文檔中的某個field對應(yīng)的value自增/減某個數(shù)字 { $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
$currentDate 設(shè)置指定字段為當前時間 db.users.update( { _id: 1 }, {$currentDate: { lastModified: true, "cancellation.date": { $type: "timestamp" } }, } )
$min 將文檔中的某字段與指定值作比較亏较,如果原值小于指定值莺褒,則不更新;若大于指定值雪情,則更新 { $min: { <field1>: <value1>, ... } }
$max 與$min功能相反 { $max: { <field1>: <value1>, ... } }
$mul 將文檔中的某個field對于的value做乘法操作 { $mul: { <field1>: <number1>, ... } }
$rename 重命名文檔中的指定字段的名 {$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
$set 更新文檔中的某一個字段遵岩,而不是全部替換 { $set: { <field1>: <value1>, ... } }
$setOnInsert 配合upsert操作,在作為insert時可以為新文檔擴展更多的field db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true } )
$unset 刪除文檔中的指定字段巡通,若字段不存在則不操作 { $unset: { <field1>: "", ... } }

6.0 數(shù)據(jù)索引

?????????索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu)尘执,可以讓我們查詢數(shù)據(jù)庫變得更快。MongoDB的索引幾乎與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫一模一樣宴凉,這其中也包括一些基本的查詢優(yōu)化技巧誊锭。
創(chuàng)建索引

db.collection.createIndex()

注意在 3.0.0 版本前創(chuàng)建索引方法為 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法弥锄,ensureIndex() 還能用丧靡,但只是 createIndex() 的別名。

查看索引

db.collection.getIndexes()

移除索引

db.collection.dropIndex()
db.collection.dropIndexes()

修改索引,先刪除再創(chuàng)建

6.0.0 單一索引

如果插入的文檔中不包含uId鍵叉讥,那么該文檔中該鍵的值為null

//插入重復的uId之后就會報錯
db.test.createIndex({"uId":1},{"unique":true})

6.0.1 聯(lián)合索引

?????????通過使用索引窘行,數(shù)據(jù)庫會對數(shù)據(jù)庫中索引中所表示的字段保持已排序狀態(tài),也就 是說图仓,我們能夠方便的針對該字段進行排序查詢罐盔,MongoDB能夠很快返回結(jié)果,但是這種幫助只能在查詢字段在首位的情況下才能 生效救崔,如果該字段不在查詢的首位惶看,就可能無法使用到該索引帶來的好處了,如:

db.users.createIndex({"username":1})
db.users.find().sort({"age": 1, "username" : 1})//此處報錯

error: {
"$err" : "too much data for sort() with no index. add an index or specify a smaller limit",
"code" : 10128
}

這樣操作后六孵,索引中第一個字段“age”按照升序排列進行排序纬黎,第二個字段 “username”也在第一個字段的范圍內(nèi)按照升序排列,eg:


聯(lián)合索引.jpg

createIndex() 接收可選參數(shù)劫窒,可選參數(shù)列表如下:

Parameter Type Description
background Boolean 建索引過程會阻塞其它數(shù)據(jù)庫操作本今,background可指定以后臺方式創(chuàng)建索引,即增加 "background" 可選參數(shù)主巍。 "background" 默認值為false冠息。
unique Boolean 建立的索引是否唯一。指定為true創(chuàng)建唯一索引孕索。默認值為false.
name string 索引的名稱逛艰。如果未指定,MongoDB的通過連接索引的字段名和排序順序生成一個索引名稱搞旭。
dropDups Boolean 3.0+版本已廢棄散怖。在建立唯一索引時是否刪除重復記錄,指定 true 創(chuàng)建唯一索引菇绵。默認值為 false.
sparse Boolean 對文檔中不存在的字段數(shù)據(jù)不啟用索引;這個參數(shù)需要特別注意镇眷,如果設(shè)置為true的話咬最,在索引字段中不會查詢出不包含對應(yīng)字段的文檔.。默認值為 false.
expireAfterSeconds integer 指定一個以秒為單位的數(shù)值偏灿,完成 TTL設(shè)定丹诀,設(shè)定集合的生存時間。
v index version 索引的版本號翁垂。默認的索引版本取決于mongod創(chuàng)建索引時運行的版本。
weights document 索引權(quán)重值硝桩,數(shù)值在 1 到 99,999 之間沿猜,表示該索引相對于其他索引字段的得分權(quán)重。
default_language string 對于文本索引碗脊,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表啼肩。 默認為英語
language_override string 對于文本索引,該參數(shù)指定了包含在文檔中的字段名衙伶,語言覆蓋默認的language祈坠,默認值為 language.

相關(guān)博文參考:
MongoDB索引的使用
MongoDB高級查詢
MongoDB官網(wǎng)

7.0 查詢分析

??????explain是非常有用的工具,會幫助你獲得查詢方面諸多有用的信息矢劲。只要對游標調(diào)用該方法赦拘,就可以得到查詢細節(jié)。explain會返回一個文檔芬沉,而不是游標本身

db.tablename.find().explain( "executionStats" )

在explain中輸入executionStats會輸出查詢的時間值:

explain.executionStats.executionTimeMillis

8.0 aggregate聚合管道

管道操作符 與MySql對比 描述
$project SELECT 重命名躺同,刪除,修改字段
$match WHERE/HAVING 條件匹配
$lookup JOIN 表連接
$skip 跳過文檔數(shù)量
$limit LIMIT 限制文檔數(shù)量
$sort ORDER BY 文檔排序
$group GROUP 文檔分組
collections_name文檔結(jié)構(gòu):
{ 
    "_id" : ObjectId("5c124aaaa616c03bb0b86594"),
    "cid" : "1", 
    "author_id" : 10, 
    "title" : "標題信息", 
    "content" : "內(nèi)容信息", 
    "description" : "文章描述信息" 丸逸,
    "zan_count":215
}
db.COLLECTION_NAME.aggragate([
    {  $match:{"zan_count":{$gte:100,$lte:500}}//過濾掉贊數(shù)量值在100-500的數(shù)據(jù)},
    {  $limit:10//只顯示10條 },
    {  $skip:2//跳過前兩條  },
    {  $sort:{author_id:1}//以zan_count 升序排列 },
    {  $project:{zan_count:1,cid:1,author_id:1}//過濾字段蹋艺,_id默認強制保留},
    {
        $group:{
            _id:"$cid",//以cid進行分組
            $total:{$sum:"$zan_count"}//將zan_count相加
        }
    },
   {
       $lookup:{
           from:"articleCagetory",//關(guān)聯(lián)表
           local_field:"cid",COLLECTION_NAME//的關(guān)聯(lián)字段
           foregin_field:"categoryId",//articleCagetory的關(guān)聯(lián)字段
           as:"category"http://articleCagetory關(guān)聯(lián)之后的名稱
       }
   }
])

類似上面$sum的管道操作表達式還有

官網(wǎng)更多管道操作符請看--》

常用表達式操作符 Description
$addToSet 將文檔指定字段的值去重
$max 文檔指定字段的最大值
$min 文檔指定字段的最小值
$sum 文檔指定字段求和
$avg 文檔指定字段求平均
$gt 大于給定值
$lt 小于給定值
$eq 等于給定值

aggragate官網(wǎng)用法

Mongodb 賬戶權(quán)限配置

1黄刚、第一步創(chuàng)建超級管理用戶

 use admin
db.createUser({ user:'admin', pwd:'123456', roles:[{role:'root',db:'admin'}] })

2捎谨、第二步修改 Mongodb 數(shù)據(jù)庫配置文件

mongod.cfg
配置: security: authorization: enabled

3、第三步重啟 mongodb 服務(wù)
4憔维、第四步用超級管理員賬戶連接數(shù)據(jù)庫

mongo admin -u 用戶名 -p 密碼 ::或者
mongo 192.168.1.200:27017/test -u user -p password

5涛救、第五步給 testdb數(shù)據(jù)庫創(chuàng)建一個用戶 只能訪問 testdb不能訪問其他數(shù)據(jù)庫

use eggcms
db.createUser( { user: "testdbAdmin", pwd: "123456", roles: [ { role: "dbOwner", db: "testdb" } ] } )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市埋同,隨后出現(xiàn)的幾起案子州叠,更是在濱河造成了極大的恐慌,老刑警劉巖凶赁,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咧栗,死亡現(xiàn)場離奇詭異逆甜,居然都是意外死亡,警方通過查閱死者的電腦和手機致板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門交煞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斟或,你說我怎么就攤上這事素征。” “怎么了萝挤?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵御毅,是天一觀的道長。 經(jīng)常有香客問我怜珍,道長端蛆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任酥泛,我火速辦了婚禮今豆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柔袁。我一直安慰自己呆躲,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布捶索。 她就那樣靜靜地躺著插掂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪情组。 梳的紋絲不亂的頭發(fā)上燥筷,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音院崇,去河邊找鬼肆氓。 笑死,一個胖子當著我的面吹牛底瓣,可吹牛的內(nèi)容都是我干的谢揪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼捐凭,長吁一口氣:“原來是場噩夢啊……” “哼拨扶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茁肠,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤患民,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垦梆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匹颤,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡仅孩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了印蓖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽慕。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赦肃,靈堂內(nèi)的尸體忽然破棺而出溅蛉,到底是詐尸還是另有隱情,我是刑警寧澤他宛,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布船侧,位于F島的核電站,受9級特大地震影響堕汞,放射性物質(zhì)發(fā)生泄漏勺爱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一讯检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卫旱,春花似錦人灼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至适贸,卻和暖如春灸芳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拜姿。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工烙样, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕊肥。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓谒获,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壁却。 傳聞我的和親對象是個殘疾皇子批狱,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容