Java-MongoDB詳細(xì)記錄

?趾疚、MongoDb的體系結(jié)構(gòu)

NoSql的概念

NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是 SQL ”痛侍,關(guān)系型數(shù)據(jù)庫特點(diǎn)是規(guī)范的數(shù)據(jù)結(jié)構(gòu)钥弯,表與表之間通過外鍵進(jìn)?關(guān)聯(lián),這些特征使我們對數(shù)據(jù)的管理更加清晰和嚴(yán)謹(jǐn)垂寥,但隨著互聯(lián)網(wǎng)的發(fā)展數(shù)據(jù)成爆炸式的增?我們對數(shù)據(jù)庫需要更好的靈活性和更快的速度颠黎。這就是NoSql可以做到 的。它不需要預(yù)先定義模式滞项,沒有主外鍵關(guān)聯(lián)狭归、支持分片、支持復(fù)本文判。

NoSql的分類

鍵值(Key-Value)存儲數(shù)據(jù)庫

這?類數(shù)據(jù)庫主要會使?到?個哈希表过椎,這個表中有?個特定的鍵和?個指針指向特定的 數(shù)據(jù)。Key/value模型對于IT系統(tǒng)來說的優(yōu)勢在于簡單戏仓、易部署疚宇。但是如果DBA只對部分值進(jìn)行查詢或更新的時候,Key/value就顯得效率低下了赏殃。舉例如:Redis.

列存儲數(shù)據(jù)庫

這部分?jǐn)?shù)據(jù)庫通常是?來應(yīng)對分布式存儲的海量數(shù)據(jù)敷待。鍵仍然存在,但是它們的特點(diǎn)是指 向了多個列嗓奢。這些列是由列家族來安排的讼撒。如:Cassandra, HBase, Riak.

?檔型數(shù)據(jù)庫

?檔型數(shù)據(jù)庫的靈感是來?于Lotus Notes辦公軟件的,?且它同第?種鍵值存儲相類似股耽。該類型的數(shù)據(jù)模型是版本化的?檔根盒,半結(jié)構(gòu)化的?檔以特定的格式存儲,?如JSON物蝙。?檔型數(shù)據(jù)庫可以看作是鍵值數(shù)據(jù)庫的升級版炎滞,允許之間嵌套鍵值。?且?檔型數(shù)據(jù)庫?鍵值 數(shù)據(jù)庫的查詢效率更?诬乞。如:CouchDB, MongoDb册赛。

圖形(Graph)數(shù)據(jù)庫

圖形結(jié)構(gòu)的數(shù)據(jù)庫同其他?列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同钠导,它是使?靈活的圖形模 型,并且能夠擴(kuò)展到多個服務(wù)器上森瘪。NoSQL數(shù)據(jù)庫沒有標(biāo)準(zhǔn)的查詢語?(SQL)牡属,因此進(jìn)?數(shù)據(jù) 庫查詢需要制定數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫都有REST式的數(shù)據(jù)接?或者查詢API扼睬。

MongoDb的邏輯組成
image.png

邏輯結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的對比

關(guān)系型數(shù)據(jù)庫 MongoDb
database(數(shù)據(jù)庫) database(數(shù)據(jù)庫)
table (表) collection( 集合)
row( 行) document( BSON 文檔)
column (列) field (字段)
index(唯一索引逮栅、主鍵索引) index (全文索引)
join (主外鍵關(guān)聯(lián)) embedded Document (嵌套文檔)
primary key(指定1至N個列做主鍵) primary key (指定_id field做為主鍵)
aggreation(groupy) aggreation (pipeline mapReduce)

二、MongoDb使用

mongoDb 由C++編寫窗宇,下載下來的包可以直接啟動措伐。

參數(shù) 說明
dbpath 數(shù)據(jù)庫目錄坪哄,默認(rèn)/data/db
bind_ip 監(jiān)聽IP地址昆烁,默認(rèn)全部可以訪問
port 監(jiān)聽的端口,默認(rèn)27017
logpath 日志路徑
logappend 是否追加日志
auth 是開啟用戶密碼登陸
fork 是否已后臺啟動的方式登陸
config 指定配置文件

mongo shell 是一個js 控臺弃锐,可以執(zhí)行js 相關(guān)運(yùn)算

數(shù)據(jù)庫與集合的基礎(chǔ)操作
  #查看數(shù)據(jù)庫
  show dbs;
  #切換數(shù)據(jù)庫
  use luban;
  #創(chuàng)建數(shù)據(jù)庫與集合粪躬,在插入數(shù)據(jù)時會自動 創(chuàng)建數(shù)據(jù)庫與集和
  db.friend.insertOne({name:"wukong",sex:"man"});
  #查看集合
  show tables;
  show collections;
  #刪除集合
  db.friend.drop();
  #刪除數(shù)據(jù)庫
  db.dropDatabase();
MongoDB CRUD

數(shù)據(jù)插入

//插入單條 
db.friend.insertOne({name:"wukong"担败,sex:"man"});
// 插入多條
db.friend.insertMany([
{name:"wukong",sex:"man"},
{name:"diaocan",sex:"woman",age:18,birthday:new Date("1995-11-02")},
{name:"zixiao",sex:"woman"}]);
// 指定ID 
db.friend.insert([
{_id:1,name:"wokong",sex:"man",age:1},
{_id:2,name:"diaocan",sex:"women",birthday:new Date("1988-11-11")}])

注意:數(shù)據(jù)插入,一個集合內(nèi)的數(shù)據(jù)格式可以完全不相同短蜕,但不建議這樣氢架,每條數(shù)據(jù)都有唯一id傻咖,id默認(rèn)自動生成朋魔,但也可以指定,前提是不能重復(fù)卿操,否則報錯警检。

數(shù)據(jù)查詢

a.基于條件的基礎(chǔ)查詢
b.$and、$or害淤、$in扇雕、$gt、$gte窥摄、$lt镶奉、$lte 運(yùn)算符
c.基于 sort skip limit 方法實(shí)現(xiàn)排序與分頁
d.嵌套查詢
e.數(shù)組查詢
f.數(shù)組嵌套查詢

值運(yùn)算:$in、$gt崭放、$gte哨苛、$lt、$lte币砂、$all
$in:值在范圍內(nèi)存在建峭。
$gt:大于值。
$gte:大于等于值决摧。
$lt:小于值亿蒸。
$lte:小于等于值凑兰。
$all:值在范圍內(nèi)都存在。

邏輯運(yùn)算:$and边锁、$or
其值為多個邏輯的組合運(yùn)算姑食,后面跟中括號,中括號包括多個大括號茅坛∈该牛基于具體的值進(jìn)行運(yùn)算

#基于ID查找
db.emp.find({_id:1101})
#基于屬性查找
db.emp.find({"name":"魯班"})
# && 運(yùn)算 與大于 運(yùn)算
db.emp.find({"job":"講師","salary":{$gt:8000}})
# in 運(yùn)算 工作為"講師"或者"客服部"
 db.emp.find({"job":{$in:["講師","客服部"]}})
# or 運(yùn)算 工作為"講師"或者"客服部"  || 名字是貂蟬 或者 年齡18
db.emp.find({$or:[{job:"講師"  },{job:"客服部"}] })
db.friend.find({$or:[{"name":"貂蟬"},{age:{$gte:18}}]});
  • 排序與分頁
# 首先按dep升序salary降序排列,然后從第5條開始灰蛙,最后選擇2條數(shù)據(jù)祟剔。
db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)
  • 嵌套查詢
# 數(shù)據(jù)
{_id:"001",name:"陳霸天",grade:{redis:87,dubbo:90,zookeper:85}}
# 錯誤示例:無結(jié)果
db.student.find({grade:{redis:87,dubbo:90 });
# 錯誤示例:無結(jié)果 
db.student.find({grade:{redis:87,dubbo:90,zookeper:85} })
# 正確示例:基于復(fù)合屬性查找 時必須包含其所有的值 并且順序一至
db.student.find({grade:{redis:87,zookeper:85,dubbo:90} })
#基于復(fù)合屬性當(dāng)中的指定值 查找。注:名稱必須用雙引號
db.student.find({"grade.redis":87});
db.student.find({"grade.redis":{"$gt":80}});
  • 數(shù)組查詢
# 數(shù)據(jù)
{_id:"001",name:"陳霸天",subjects:["redis","zookeper","dubbo"]}
# 無結(jié)果
db.subject.find({subjects:["redis","zookeper"]})
# 無結(jié)果
db.subject.find({subjects:["zookeper","redis","dubbo"]})
# 與嵌套查詢一樣摩梧,必須是所有的值 并且順序一至
db.subject.find({subjects:["redis","zookeper","dubbo"]})
# $all 匹配數(shù)組中包含該兩項(xiàng)的值物延。注:順序不作要求
db.subject.find({subjects:{"$all": ["redis","zookeper"]}})
# 簡化數(shù)組查詢
db.subject.find({subjects:"redis"})
# 簡化數(shù)組查詢 ,匹配數(shù)組中存在任意一值仅父。與$all相對應(yīng)
db.subject.find({subjects:{$in: ["redis","zookeper"]}})
  • 數(shù)組嵌套查詢
# 數(shù)據(jù)
{_id:"001",name:"陳霸天",subjects:[{name:"redis",hour:12},{name:"java",hour:12}]}
# 基礎(chǔ)查詢 叛薯,必須查詢?nèi)浚翼樞蛞恢?db.subject2.find({subjects:{name:"redis",hour:12} })
# 指定查詢第一個數(shù)組 課時大于12
db.subject2.find({"subjects.0.hour":{$gt:12}})
# 查詢?nèi)慰颇?課時大于12
db.subject2.find({"subjects.hour":{$gt:12}})
# $elemMatch 元素匹配笙纤,指定屬性滿足耗溜,且不要求順序一至
db.subject2.find({subjects:{$elemMatch:{name:"redis",hour:12}}})
# 數(shù)組中任意元素匹配 不限定在同一個對象當(dāng)中
db.subject2.find({"subjects.name":"mysql","subjects.hour":120})
  • 數(shù)據(jù)的修改與刪除
db.表.update( 條件,{設(shè)置值}省容,false,false )

$set :設(shè)置值
$unset :刪除指定字段
$inc:自增

# 設(shè)置值
db.emp.update({_id:1101} ,{ $set:{salary:10300}  })
# 自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
# 基于條件 更新多條數(shù)據(jù)
# 只會更新第一條 
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的條件 
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})
# $unset刪除字段
db.subject2.update({"_id":"001"},{$unset:{"subjects":1}})
  • 嵌套數(shù)組修改
$addToSet : 添加至集合 ( 命令區(qū)分大小寫)
$push: 推送至集合 
$pull:從集合中刪除
$pop:刪除集合中的 兩端未尾元素抖拴。

# $addToSet:添加至集合,多次執(zhí)行不會重復(fù)插入
db.subject2.update({"_id":"001"},{$addToSet:{"subjects":{"name":"mongodb","hour":20}}})
# $push:推送至集合腥椒,不判斷重復(fù)
db.subject2.update({"_id":"001"},{$push:{"subjects":{"name":"mongodb","hour":20}}})
# $pull:將匹配的元素項(xiàng)阿宅,從集合中全部刪除
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"name":"mongodb","hour":20}}})
# 僅匹配一個字段
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"name":"mongodb"}}})
# $addToSet、$push笼蛛、$pull  均可操作數(shù)組洒放,效果等同于執(zhí)行多次數(shù)組中元素。
db.subject2.update({"_id":"001"},{$addToSet:{"subjects":[{"name":"mongodb","hour":20},{"name":"mongodb2","hour":22}]}})
# $pop:刪除集合中的 兩端未尾元素滨砍。
# -1 刪除隊(duì)首 元素
db.subject2.update({"_id":"001"},{$pop:{"subjects":-1}})
# 1 刪除隊(duì)尾元素
db.subject2.update({"_id":"001"},{$pop:{"subjects":-1}})
注:值僅能是 1 或 -1往湿, 不能是其它值
# upsert  更新時如果記錄不存在,將會進(jìn)行插入操作
db.subject2.update({"_id":"009"},{$set:{"name":"陳陳"}},true)
刪除
// 基于查找刪除
db.emp.deleteOne({_id:1101})
// 刪除整個集合
db.project.drop()
// 刪除庫
db.dropDatabase()

三惋戏、mongoDB的聚合操作

mongoDB的聚合操作主要分為pipeline和mapRedurce领追。pipeline 速度快,但只能運(yùn)行在單機(jī)上日川,適合數(shù)據(jù)量小的實(shí)時聚合操作蔓腐。mapRedurce 可以運(yùn)行在分布式節(jié)點(diǎn),適適大數(shù)量并且復(fù)雜的聚合分析操作龄句。

Pipeline 聚合

pipeline 聚合其特性是運(yùn)行速度快回论,只能運(yùn)行在單機(jī)上散罕,并且對資源的使用有一定限制如下:

  • 單個的聚合操作耗費(fèi)的內(nèi)存不能超過20%
  • 返回的結(jié)果集大小在16M以內(nèi)

語法說明
aggredate 方法接收任意多個參數(shù),每個參數(shù)都是一個具體類別的聚合操作傀蓉,通過參數(shù)的順序組成一個執(zhí)行鏈欧漱。每個操作執(zhí)行完后將返回結(jié)果交給下一個操作。值到最后產(chǎn)出結(jié)果葬燎。

Pipeline相關(guān)運(yùn)算符

$match :匹配過濾聚合的數(shù)據(jù)
$project:返回需要聚合的字段
$group:統(tǒng)計(jì)聚合數(shù)據(jù) 误甚,必須指定_id 列.
- $max:求出最大值
- $sum:求和
- $avg:求平均值
- $push: 將結(jié)果插入至一個數(shù)組當(dāng)中
- $addToSet:將結(jié)果插入至一個數(shù)組當(dāng)中,并去重
- $first:取第一個值
- $last:取最后一個值
$limit:用來限制MongoDB聚合管道返回的文檔數(shù)谱净。
$skip:在聚合管道中跳過指定數(shù)量的文檔窑邦,并返回余下的文檔。
$unwind:(flatmap)將文檔中的某一個數(shù)組類型字段拆分成多條壕探,每條包含數(shù)組中的一個值冈钦。
$sort:將輸入文檔排序后輸出。

示例:

# $match 條件過濾 
db.emp.aggregate({$match:{"job":"講師"}})
# $project 指定列返回
#返回指定例,_id 自動帶上
db.emp.aggregate({$match:{"job":"講師"}},{$project:{"job":1,"salary":1}})
#返回指定列李请,并修改列名
db.emp.aggregate({$match:{"job":"講師"}},{$project:{"工作":"$job","薪水":"$salary"}})

# $group 操作 ( 必須指定_id 列)  
# 基于工作分組瞧筛,并求出薪水總和
db.emp.aggregate({$group:{_id:"$job",total:{$sum:"$salary"}}})
# 求出薪水最大值
db.emp.aggregate({$group:{_id:"$job",total:{$max:"$salary"}}})
# 將所有薪水添加列表
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}})
# 將所有薪水添加列表 并去重
db.emp.aggregate({$group:{_id:"$job",total:{$addToSet:"$salary"}}})

# 聚合操作可以任意個數(shù)和順序的組合
# 二次過濾
db.emp.aggregate({$match:{"job":"講師"}},{$project:{"工作":"$job","薪水":"$salary"}},{$match:{"薪水":{$gt:8000}}})
# $skip 與 $limit 跳轉(zhuǎn) 并限制返回?cái)?shù)量   
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}},{$limit:4},{$skip:2});
# sort 排序 
db.emp.aggregate({$project:{"工作":"$job","salary":1}},{$sort:{"salary":1,"工作":1}});
# unwind 操作,將數(shù)組拆分成多條記錄
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}},{$unwind:"$total"});
MapRedurce 聚合

mapRedurce 非常適合實(shí)現(xiàn)非常復(fù)雜 并且數(shù)量大的聚合計(jì)算导盅,其可運(yùn)行在多臺節(jié)點(diǎn)上實(shí)行分布式計(jì)算较幌。
MapReduce 現(xiàn)大量運(yùn)用于hadoop大數(shù)據(jù)計(jì)算當(dāng)中,其最早來自于google 的一遍論文白翻,解決大PageRank搜索結(jié)果排序的問題乍炉。其大至原理如下:

  • mongodb中mapRedurce的使用流程
    1.創(chuàng)建Map函數(shù),
    2.創(chuàng)建Redurce函數(shù)
    3.將map嘁字、Redurce 函數(shù)添加至集合中恩急,并返回新的結(jié)果集
    4.查詢新的結(jié)果集
// 創(chuàng)建map 對象 ,group key纪蜒,value以數(shù)組形式展示
var map1=function (){
    emit(this.job,1); // 內(nèi)置函數(shù) key,value
}
// 創(chuàng)建reduce 對象 ,接收key此叠,以及values[value,value,value,value]
var reduce1=function(key,values){
     return Array.sum(values);
}
 // 執(zhí)行mapReduce 任務(wù) 并將結(jié)果放到新的集合 result 當(dāng)中
db.emp.mapReduce(map1,reduce1,{out:"result"});
// 查詢新的集合
db.result.find()

# 使用復(fù)合對象作為key
var map2=function (){
    emit({"job":this.job,"dep":this.dep},{"name":this.name,"dep":this.dep});
}

var reduce2=function(key,values){
    return values.length;
}
 
db.emp.mapReduce(map2,reduce2,{out:"result2"}).find()

# 調(diào)式 mapReduce 執(zhí)行
var emit=function(key,value){
    print(key+":"+value);
}

四纯续、mongoDB的索引特性

  1. 索引的基礎(chǔ)概念
  2. 單鍵索引
  3. 多鍵索引
  4. 復(fù)合索引
  5. 過期索引
  6. 全文索引
1. 索引的基礎(chǔ)概念

每個集合(表)默認(rèn)情況下都會有一個索引(_id)。

# 查看執(zhí)行計(jì)劃:
db.emp.find({"salary":{$gt:500}}).explain()
#創(chuàng)建索引
db.emp.createIndex({salary:1})
#查看索引
db.emp.getIndexes()
#查看執(zhí)行計(jì)劃
db.emp.find({"salary":{$gt:500}}).explain()

單鍵索引

# 單個例上創(chuàng)建索引:
db.subject.createIndex({"name":1})
# 嵌套文檔中的列創(chuàng)建索引
db.subject.createIndex({"grade.redis":1})
# 整個嵌套文檔創(chuàng)建索引
db.subject.createIndex({"grade":1})

復(fù)合索引

# 建復(fù)合索引
db.emp.createIndex( { "job":1,"salary":-1}  )
# 查看執(zhí)行計(jì)劃:
db.emp.find({"job":"講師", "salary":{$gt:500}}).explain()
db.emp.find({"job":"講師"}).explain()
db.emp.find({"salary":{$gt:500}}).explain()
# 復(fù)合索引如下
job_1_salary_-1灭袁,復(fù)合索引遵循最左原則猬错。
db.emp.find({"job":"講師","salary":{$gt:5000}}).explain()  // 走索引
db.emp.find({"salary":{$gt:5000},"job":"講師"}).explain()  // 走索引
db.emp.find({"job":"講師"}).explain()    // 走索引
db.emp.find({"salary":{$gt:5000}}).explain()  //不走索引
# 排序 場景
db.emp.find({}).sort({"job":1,"salary":-1}).explain()// 完全匹配  ==>走索引
db.emp.find({}).sort({"job":-1,"salary":1}).explain()//完全不匹配 ==>走索引
db.emp.find({}).sort({"job":1,"salary":1}).explain()// 一半匹配 ==>不走索引
db.emp.find({}).sort({"job":-1,"salary":-1}).explain()// 一半匹配 ==>不走索引
db.emp.find({}).sort({"job":-1}).explain()  //  ==>走索引
db.emp.find({}).sort({"salary":-1}).explain()      // ==>不走索引

過期索引

過期索引存在一個過期的時間,如果時間過期茸歧,相應(yīng)的數(shù)據(jù)會被自動刪除倦炒,注意這邊刪除的是數(shù)據(jù),而不是索引软瞎。

# 示例
# 插入數(shù)據(jù)
db.log.insert({"title":"this is logger info","createTime":new Date()})
# 創(chuàng)建過期索引
db.log.createIndex({"createTime":1},{expireAfterSeconds:10})

全文索引

# 創(chuàng)建全文索引
db.project.createIndex( {"name":"text","description":"text"})
# 使用全文索引進(jìn)行查詢逢唤,查找的是包含"java"或者"dubbo" 
db.project.find({$text:{$search:"java dubbo"}})
# 用于屏蔽關(guān)鍵字拉讯,查找的是包含"java"但屏蔽"dubbo"
db.project.find({$text:{$search:"java -dubbo"}})
# 短語查詢,\" 包含即可,查找的是"Apache Dubbo"
db.project.find({$text:{$search:"\"Apache Dubbo\""}})
# 中文查詢鳖藕,查找的是包含"阿里"或者"開源" 
db.project.find({$text:{$search:"阿里 開源"}})

五魔慷、MongoDB 集群

MongoDB 復(fù)制集群
image.png

PRIMARY 節(jié)點(diǎn): 可以查詢和新增數(shù)據(jù)
SECONDARY 節(jié)點(diǎn):只能查詢 不能新增 基于priority 權(quán)重可以被選為主節(jié)點(diǎn)
RBITER 節(jié)點(diǎn): 不能查詢數(shù)據(jù) 和新增數(shù)據(jù) ,不能變成主節(jié)點(diǎn)

注意1:MongoDB主從間的數(shù)據(jù)同步是通過日志文件oplog進(jìn)行同步的著恩,這與mysql的同步機(jī)制類似院尔。
注意2:MongoDB選舉流程比較簡單,通過比較節(jié)點(diǎn)中設(shè)置的權(quán)重喉誊,權(quán)重大的節(jié)點(diǎn)會成為新的主節(jié)點(diǎn)邀摆。

基礎(chǔ)示例

主節(jié)點(diǎn)配置

dbpath=/data/mongo/master
port=27017
fork=true
logpath=master.log
replSet=tulingCluster

從節(jié)點(diǎn)配置

  • 其中replSet相同代表著是同一個集群下的節(jié)點(diǎn)。
#子節(jié)點(diǎn)配置1
dbpath=/data/mongo/slave
port=27018
fork=true
logpath=slave.log
replSet=tulingCluster

#子節(jié)點(diǎn)配置2
dbpath=/data/mongo/slave2
port=27019
fork=true
logpath=slave2.log
replSet=tulingCluster

分別啟動三個節(jié)點(diǎn)
進(jìn)入其中一個節(jié)點(diǎn)
集群復(fù)制配置管理

# 查看復(fù)制集群的幫助方法
rs.help()

# 添加配置
# 聲明配置變量
var cfg ={"_id":"tuling",
"members":[
{"_id":1,"host":"127.0.0.1:27017"},
{"_id":2,"host":"127.0.0.1:27018"}
]
}
# 初始化配置
rs.initiate(cfg)
# 查看集群狀態(tài)
rs.status()

# 變更節(jié)點(diǎn)示例
# 插入新的復(fù)制節(jié)點(diǎn)
rs.add("127.0.0.1:27019")
# 刪除slave 節(jié)點(diǎn)
rs.remove("127.0.0.1:27019")

注:默認(rèn)節(jié)點(diǎn)下從節(jié)點(diǎn)不能讀取數(shù)據(jù)伍茄。調(diào)用 rs.slaveOk() 解決隧熙。

MongoDB 分片集群

隨著數(shù)據(jù)的增長,單機(jī)實(shí)例的瓶頸是很明顯的幻林≌甓ⅲ可以通過復(fù)制的機(jī)制應(yīng)對壓力,但mongodb中單個集群的 節(jié)點(diǎn)數(shù)量限制到了12個以內(nèi)沪饺,所以需要通過分片進(jìn)一步橫向擴(kuò)展躏敢。此外分片也可節(jié)約磁盤的存儲。

image.png
分片示例

配置 并啟動config 節(jié)點(diǎn)集群

# 節(jié)點(diǎn)1 config1-37017.conf
dbpath=/data/mongo/config1
port=37017
fork=true
logpath=logs/config1.log
replSet=configCluster
configsvr=true

# 節(jié)點(diǎn)2 config2-37018.conf
dbpath=/data/mongo/config2
port=37018
fork=true
logpath=logs/config2.log
replSet=configCluster
configsvr=true

# 進(jìn)入shell 并添加 config 集群配置:
var cfg ={"_id":"configCluster",
  "protocolVersion" : 1,
  "members":[
{"_id":0,"host":"127.0.0.1:37017"},
{"_id":1,"host":"127.0.0.1:37018"}
]
}
# 重新裝載配置整葡,并重新生成集群件余。
rs.initiate(cfg)

配置 shard 節(jié)點(diǎn)集群

# 節(jié)點(diǎn)1 shard1-47017.conf
dbpath=/data/mongo/shard1
port=47017
fork=true
logpath=logs/shard1.log
shardsvr=true

# 節(jié)點(diǎn)2 shard2-47018.conf
dbpath=/data/mongo/shard2
port=47018
fork=true
logpath=logs/shard2.log
shardsvr=true

配置 路由節(jié)點(diǎn) mongos

# 節(jié)點(diǎn) route-27017.conf
port=27017
bind_ip=0.0.0.0
fork=true
logpath=logs/route.log
configdb=conf/127.0.0.1:37017,127.0.0.1:37018

# 添加分片節(jié)點(diǎn)
sh.status()
sh.addShard("127.0.0.1:47017");
sh.addShard("127.0.0.1:47018");

# 為數(shù)據(jù)庫開啟分片功能
sh.enableSharding("tuling")
# 為指定集合開啟分片功能
sh.shardCollection("tuling.emp",{"_id":1})

# 修改分片大小
use config
db.settings.find()
db.settings.save({_id:"chunksize",value:1})

# 嘗試插入1萬條數(shù)據(jù):
for(var i=1;i<=100000;i++){
     db.emp.insert({"_id":i,"name":"copy"+i});
}

db.emp.createIndex({_id: 'hashed'})

注意:添加分片的時候,若分片為一個集群遭居,那么路由對分片的添加要注明集群名稱啼器,例如:

sh.addShard("tulingCluster/127.0.0.1:47017,127.0.0.1:47018")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俱萍,隨后出現(xiàn)的幾起案子端壳,更是在濱河造成了極大的恐慌,老刑警劉巖枪蘑,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损谦,死亡現(xiàn)場離奇詭異,居然都是意外死亡岳颇,警方通過查閱死者的電腦和手機(jī)照捡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來话侧,“玉大人栗精,你說我怎么就攤上這事≌芭簦” “怎么了悲立?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵鹿寨,是天一觀的道長。 經(jīng)常有香客問我级历,道長释移,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任寥殖,我火速辦了婚禮玩讳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚼贡。我一直安慰自己熏纯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布粤策。 她就那樣靜靜地躺著樟澜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叮盘。 梳的紋絲不亂的頭發(fā)上秩贰,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機(jī)與錄音柔吼,去河邊找鬼毒费。 笑死,一個胖子當(dāng)著我的面吹牛愈魏,可吹牛的內(nèi)容都是我干的觅玻。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼培漏,長吁一口氣:“原來是場噩夢啊……” “哼溪厘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牌柄,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤畸悬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后友鼻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傻昙,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年彩扔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僻爽。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡虫碉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胸梆,到底是詐尸還是另有隱情敦捧,我是刑警寧澤须板,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站兢卵,受9級特大地震影響习瑰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秽荤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一甜奄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃款,春花似錦课兄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紊扬,卻和暖如春蜒茄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背餐屎。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工檀葛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啤挎。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓驻谆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庆聘。 傳聞我的和親對象是個殘疾皇子胜臊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

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

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,912評論 2 89
  • 基本介紹 什么是NoSQL數(shù)據(jù)庫 NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫伙判。NoSQL有時也稱作Not Only SQL...
    我就是小政政閱讀 2,118評論 0 11
  • MongoDB MongoDB 是由C++語言編寫的象对,是一個基于分布式文件存儲的開源非關(guān)系數(shù)據(jù)庫系統(tǒng)(NoSQL)...
    茍且_7c59閱讀 249評論 0 0
  • 一、簡介 MongoDB 是一款流行的開源文檔型數(shù)據(jù)庫宴抚,從它的命名來看勒魔,確實(shí)是有一定野心的。MongoDB 的原名...
    raysonfang閱讀 596評論 0 7
  • 簡介 NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能...
    奮斗的老王閱讀 3,036評論 4 47