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:
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的管道操作表達式還有
常用表達式操作符 | Description |
---|---|
$addToSet | 將文檔指定字段的值去重 |
$max | 文檔指定字段的最大值 |
$min | 文檔指定字段的最小值 |
$sum | 文檔指定字段求和 |
$avg | 文檔指定字段求平均 |
$gt | 大于給定值 |
$lt | 小于給定值 |
$eq | 等于給定值 |
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" } ] } )