Mongodb-基礎操作

吃再多糖也不長胖發表於2020-12-28

一下內容是本人為了快速的學習mongodb基礎在菜鳥教程跟著敲並記錄下來然後進行處理,方便以後複習。

MongoDB 建立create資料庫

語法格式如下:

use DATABASE_NAME
如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。

例項

 use runoob
switched to db runoob
> db
runoob
> 

如果你想檢視所有資料庫,可以使用 show dbs 命令

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 

可以看到,我們剛建立的資料庫 runoob 並不在資料庫的列表中, 要顯示它,我們需要向 runoob 資料庫插入一些資料。

> db.runoob.insert({"name":"菜鳥教程"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
runoob  0.000GB

MongoDB 中預設的資料庫為 test,如果你沒有建立新的資料庫,集合將存放在 test 資料庫中。
注意: 在 MongoDB 中,集合只有在內容插入後才會建立! 就是說,建立集合(資料表)後要再插入一個文件(記錄),集合才會真正建立。

MongoDB 刪除drop資料庫

語法

db.dropDatabase()

例項

1.首先,檢視所有資料庫:
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
runoob  0.000GB

2.接下來我們切換到資料庫 runoob:
> use runoob
switched to db runoob
> 

3.執行刪除命令:

> db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }

4.最後,我們再通過 show dbs 命令資料庫是否刪除成功:
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

MongoDB 建立create集合collection

語法:

db.createCollection(name, options)
name: 要建立的集合名稱
options: 可選引數, 指定有關記憶體大小及索引的選項

options 可以是如下引數:

欄位型別描述
capped布林可選)如果為 true,則建立固定集合。固定集合是指有著固定大小的集合,當達到最大值時,它會自動覆蓋最早的文件。當該值為 true 時,必須指定 size 引數。
autoIndexId布林3.2 之後不再支援該引數。(可選)如為 true,自動在 _id 欄位建立索引。預設為 false。
size數值(可選)為固定集合指定一個最大值,即位元組數。如果 capped 為 true,也需要指定該欄位。
max數值(可選)指定固定集合中包含文件的最大數量。

例項

在 test 資料庫中建立 runoob 集合
> use test 
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
如果要檢視已有集合,可以使用 show collections 或 show tables 命令
> show collections
runoob
system.indexes

下面是帶有幾個關鍵引數的 createCollection() 的用法:
建立固定集合 mycol,整個集合空間大小 6142800 KB, 文件最大個數為 10000 個。

> db.createCollection("mycol", {capped : true , autoIndexId : true, size : 6142800, max :10000})
{ "ok" : 1 }
>

在 MongoDB 中,你不需要建立集合。當你插入一些文件時,MongoDB 會自動建立集合。

>db.mycol2.insert({"name" : "菜鳥教程"})
>show collections
mycol2

MongoDB 刪除drop集合collection

語法

db.collection.drop()

例項

在資料庫 mydb 中,我們可以先通過 show collections 命令檢視已存在的集合:
>use mydb
switched to db mydb
>show collections  
mycol
mycol2
system.indexes
runoob

接著刪除集合 mycol2 :
>db.mycol2.drop()
true
>
通過 show collections 再次檢視資料庫 mydb 中的集合:
>show collections
mycol
system.indexes
runoob
>

MongoDB 插入insert文件document到集合

語法

db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)

save():如果 _id 主鍵存在則更新資料,如果不存在就插入資料。該方法新版本中已廢棄,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 來代替。
insert(): 若插入的資料主鍵已經存在,則會拋 org.springframework.dao.DuplicateKeyException 異常,提示主鍵重複,不儲存當前資料

3.2 版本之後新增了 db.collection.insertOne() 和 db.collection.insertMany()。

語法
db.collection.insertOne() 用於向集合插入一個新文件,語法格式如下
db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)
db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

document:要寫入的文件。
writeConcern:寫入策略,預設為 1,即要求確認寫操作,0 是不要求。
ordered:指定是否按順序寫入,預設 true,按順序寫入。

例項:

以下文件可以儲存在 MongoDB 的 runoob 資料庫 的 col 集合中:
>db.col.insert({
	title: 'MongoDB 教程', 
	description : 'mongodb 是一個nosql資料庫',
	by : '現在是大華',
	url : 'http://hello.com',
	tags: ['mongodb', 'database', 'NoSQL'],
	 likes: 100
})
以上例項中 col 是我們的集合名,如果該集合不在該資料庫中, MongoDB 會自動建立該集合並插入文件。

檢視已插入文件:

>db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
> 

也可以定義一個變數,然後插入

定義變數
>document = ({
	title: 'MongoDB 教程', 
	description : 'mongodb 是一個nosql資料庫',
	by : '現在是大華',
	url : 'http://hello.com',
	tags: ['mongodb', 'database', 'NoSQL'],
	 likes: 100	
})
插入操作
>db.col.insert(document)

db.collection.insertOne()與db.collection.insertMany()

db.collection.insertOne({"a" :3})
 插入多條資料
 db.collection.insertManay([{"c" : 2}, {"d " : 23 }])
 從上面可見insertmany用一個陣列裝多個字典,然後插入陣列
 所以也可以這樣
 1、先建立陣列

2、將資料放在陣列中

3、一次 insert 到集合中
var arr = [];

for(var i=1 ; i<=20000 ; i++){
    arr.push({num:i});
}

db.numbers.insert(arr);

MongoDB 更新update文件document

update() 方法用於更新已存在的文件。語法格式如下:
語法

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
query : update的查詢條件,類似sql update查詢內where後面的。
update : update的物件和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
upsert : 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,丟擲異常的級別。

操作符
$lt < less than
$lte <= less than or equal to 
$gt > greater than 
$gte >= greater than or equal to

$ne != not equal 
$in {"age" : {$in : [20,30]}}
$nin not in 
$regex 正則

$exists 是否存在
$type 型別判斷 {'age' : {$type : 'int'}}
$text 文字查詢{$text : {$search : 'mike'}}
$or 查詢多種條件{$or : [{'name' : 'chen'}, {'name' : 'dsds'}]}

例項

我們在集合 col 中插入如下資料:
>db.col.insert({
    title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 資料庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

接著我們通過 update() 方法來更新標題(title):
>db.col.update(
	{"title" : "MongoDB 教程"},
	{$set:{"title" : "這是大華的mongodb學習"}}
)

上語句只會修改第一條發現的文件,如果你要修改多條相同的文件,則需要設定 multi 引數為 true

>db.col.update(
	{"title" : "'MongoDB 教程"},
	{$set : {"title" : "MongoDB"}}, 
	{multi: true}
)

save() 方法

save() 方法通過傳入的文件來替換已有文件,_id 主鍵存在就更新,不存在就插入。
語法

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
document : 文件資料。
writeConcern :可選,丟擲異常的級別。

例項:

以下例項中我們替換了 _id 為 56064f89ade2f21f36b03136 的文件資料:
>db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 資料庫",
    "by" : "Runoob",
    "url" : "http://www.runoob.com",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})
檢視
>db.col.find().pretty()

更多例項

只更新第一條記錄:
db.col.update( { “count” : { $gt : 1 } } , { $set : { “test2” : “OK”} } );

全部更新:
db.col.update( { “count” : { $gt : 3 } } , { $set : { “test2” : “OK”} },false,true );

只新增第一條:
db.col.update( { “count” : { $gt : 4 } } , { $set : { “test5” : “OK”} },true,false );

全部新增進去:
db.col.update( { “count” : { $gt : 5 } } , { $set : { “test5” : “OK”} },true,true );

全部更新:
db.col.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );

只更新第一條記錄:
db.col.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );

MongoDB 刪除(remove已經過時,先推薦用 deleteOne() 和 deleteMany() )文件document

MongoDB remove()函式是用來移除集合中的資料。
語法

db.collection.remove(
   <query>,
   <justOne>
)

如果你的 MongoDB 是 2.6 版本以後的,語法格式如下:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

數說明:

query :(可選)刪除的文件的條件。
justOne : (可選)如果設為 true 或 1,則只刪除一個文件,如果不設定該引數,或使用預設值 false,則刪除所有匹配條件的文件。
writeConcern :(可選)丟擲異常的級別。

例項:

以下文件我們執行兩次插入操作:
>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 資料庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})
使用 find() 函式查詢資料:
> db.col.find()
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>db.col.remove({'title' : 'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 })           # 刪除了兩條資料
>db.col.find()
……                                        # 沒有資料

如果你只想刪除第一條找到的記錄可以設定 justOne 為 1,如下所示:

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

如果你想刪除所有資料,可以使用以下方式(類似常規 SQL 的 truncate 命令):

>db.col.remove({})
>db.col.find()
>

deleteOne() 和 deleteMany()

如刪除集合下全部文件:

db.inventory.deleteMany({})

刪除 status 等於 A 的全部文件:

db.inventory.deleteMany({ status : "A" })

刪除 status 等於 D 的一個文件:

db.inventory.deleteOne( { status: "D" } )

remove() 方法 並不會真正釋放空間。
需要繼續執行 db.repairDatabase() 來回收磁碟空間。

> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })

MongoDB 查詢文件

MongoDB 查詢文件使用 find() 方法。
find() 方法以非結構化的方式來顯示所有文件。
語法

db.collection.find(query, projection)
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。

如果你需要以易讀的方式來讀取資料,可以使用 pretty() 方法,語法格式如下:

>db.col.find().pretty()

例項

 db.col.find().pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 資料庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文件。

db.col.findOne()

MongoDB查詢邏輯 與 RDBMS Where 語句比較

在這裡插入圖片描述

MongoDB AND 條件

MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。

>db.col.find({key1:value1, key2:value2}).pretty()
> db.col.find({"by":"菜鳥教程", "title":"MongoDB 教程"}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 資料庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

MongoDB OR 條件

MongoDB OR 條件語句使用了關鍵字 $or,語法格式如下:

>db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

例項

db.col.find(
	{$or : [ {'by': '菜
	鳥教程'}, {"title": "MongoDB 教程"}]}
).pretty()

AND 和 OR 聯合使用

以下例項演示了 AND 和 OR 聯合使用,類似常規 SQL 語句為: ‘where likes>50 AND (by = ‘菜鳥教程’ OR title = ‘MongoDB 教程’)’

db.col.find(
	{'like' : {$gt : 50}, $or :[ {'by' : '菜鳥教程'}, {'title' : 'MongoDB 教程'}]}
).pretty()

MongoDB 條件操作符 $

條件操作符用於比較兩個表示式並從mongoDB集合中獲取資料。

在本章節中,我們將討論如何在MongoDB中使用條件操作符。

MongoDB中條件操作符有:
(>) 大於 - $gt
(<) 小於 - $lt
(>=) 大於等於 - $gte
(<= ) 小於等於 - $lte
$ne ----------- not equal !=
$eq -------- equal =

MongoDB (>) 大於操作符 - $gt

如果你想獲取 "col" 集合中 "likes" 大於 100 的資料,你可以使用以下命令:
>db.col.find({'likes' :{$gt : 100} })
類似於SQL語句:
Select * from col where likes > 100;

MongoDB(>=)大於等於操作符 - $gte

如果你想獲取"col"集合中 “likes” 大於等於 100 的資料,你可以使用以下命令:

>db.col.find({'like' : {$gt: 100}}).pretty()
>類似於SQL語句:
>Select * from col where likes >=100;

MongoDB (<) 小於操作符 - $lt

如果你想獲取"col"集合中 "likes" 小於 150 的資料,你可以使用以下命令:
>db.col.find({'likes' : {$lt: 150 }})
>類似
>Select * from col where likes < 150;

MongoDB (<=) 小於等於操作符 - $lte

如果你想獲取"col"集合中 "likes" 小於等於 150 的資料,你可以使用以下命令:
db.col.find({'likes' : {$lte : 150 }})

MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt

如果你想獲取"col"集合中 "likes" 大於100,小於 200 的資料,你可以使用以下命令:
db.col.find({'like' : {$lt : 200, $ gt : 100}})
類似於SQL語句:
Select * from col where likes>100 AND  likes<200;

模糊查詢

查詢 title 包含"教"字的文件:
db.col.find({'title': /'教'/})
查詢 title 欄位以"教"字開頭的文件:
db.col.find({'title' : /^'教'/})
查詢 titl e欄位以"教"字結尾的文件:
db.col.find({'title' : /‘教’$})

MongoDB $type 操作符

$type操作符是基於BSON型別來檢索集合中匹配的資料型別,並返回結果。

例項
如果想獲取 “col” 集合中 title 為 String 的資料,你可以使用以下命令:

db.col.find({"title" : {$type : 2}})
或
db.col.find({'title'  : {$type: 'string'}})

MongoDB Limit與Skip方法

Limit

如果你需要在MongoDB中讀取指定數量的資料記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數字引數,該引數指定從MongoDB中讀取的記錄條數。
語法
limit()方法基本語法如下所示:

>db.COLLECTION_NAME.find().limit(NUMBER)

例項

> db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
>

Skip

我們除了可以使用limit()方法來讀取指定數量的資料外,還可以使用skip()方法來跳過指定數量的資料,skip方法同樣接受一個數字引數作為跳過的記錄條數。
語法

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

MongoDB sort() 方法

在 MongoDB 中使用 sort() 方法對資料進行排序,sort() 方法可以通過引數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。、
語法:

>db.COLLECTION_NAME.find().sort({KEY:1})

例項

db.col.find().sort({'likes' : 1})

MongoDB 索引CreateIndex

索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取資料時必須掃描集合中的每個檔案並選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的效能是非常致命的。

索引是特殊的資料結構,索引儲存在一個易於遍歷讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構

createIndex() 方法建立索引

注意在 3.0.0 版本前建立索引方法為 db.collection.ensureIndex(),之後的版本使用了 db.collection.createIndex() 方法,ensureIndex() 還能用,但只是 createIndex() 的別名。

語法

>db.collection.createIndex(keys, options)
>語法中 Key 值為你要建立的索引欄位,options 為1或-1,1 為指定按升序建立索引,如果你想按降序來建立索引指定為 -1 即可。

例項

單欄位索引
db.col.createIndex({'title' : 1})

多欄位索引
db.col.createIndex({'title' : 1, 'description' : -1})

createIndex() 接收可選引數,可選引數列表如下:
在這裡插入圖片描述
例項

在後臺建立索引:
db.col.createIndex({'title' : 1}, {background : true})

索引的一些操作

1、檢視集合索引

db.col.getIndexes()

2、檢視集合索引大小

db.col.getIndexSize()

3、刪除集合所有索引

db.col.dropIndexes()

4、刪除集合指定索引

db.col.dropIndex('title')

5.利用 TTL 集合對儲存的資料進行失效時間設定:經過指定的時間段後或在指定的時間點過期,MongoDB 獨立執行緒去清除資料。類似於設定定時自動刪除任務,可以清除歷史記錄或日誌等前提條件,設定 Index 的關鍵欄位為日期型別 new Date()。

例如資料記錄中 createDate 為日期型別時:

 設定時間180秒後自動清除。
 設定在建立記錄後,180 秒左右刪除。
 db.col.createIndex({'createDate' : 1 }, {expireAfterSeconds : 180})


由記錄中設定日期點清除。

設定 A 記錄在 2019 年 1 月 22 日晚上 11 點左右刪除,A 記錄中需新增 "ClearUpDate": new Date('Jan 22, 2019 23:00:00'),且 Index中expireAfterSeconds 設值為 0。
db.createIndex({'createDate' : 1}, {expireAfterSeconds : 0})

索引關鍵欄位必須是 Date 型別。
非立即執行:掃描 Document 過期資料並刪除是獨立執行緒執行,預設 60s 掃描一次,刪除也不一定是立即刪除成功。
單欄位索引,混合索引不支援。

MongoDB 聚合aggregate

MongoDB 中聚合(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。
有點類似 SQL 語句中的 count(*)。
語法

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

例項

{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},
我們通過以上集合計算每個作者所寫的文章數,使用aggregate()計算結果如下:
db.col.aggregate([
	{$group : {_id : '$by_user', 
	num_tutorial : ($sum :1 )}}
])
類似
 select by_user, count(*) from mycol group by by_user

下表展示了一些聚合的表示式:

在這裡插入圖片描述

管道

管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的引數。

MongoDB的聚合管道將MongoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。

表示式:處理輸入文件並輸出。表示式是無狀態的,只能用於計算當前聚合管道的文件,不能處理其它的文件。

這裡我們介紹一下聚合框架中常用的幾個操作:

$project:修改輸入文件的結構。可以用來重新命名、增加或刪除域,也可以用於建立計算結果以及巢狀文件。
m a t c h : 用 於 過 濾 數 據 , 只 輸 出 符 合 條 件 的 文 檔 。 match:用於過濾資料,只輸出符合條件的文件。 matchmatch使用MongoDB的標準查詢操作。
$limit:用來限制MongoDB聚合管道返回的文件數。
$skip:在聚合管道中跳過指定數量的文件,並返回餘下的文件。
$unwind:將文件中的某一個陣列型別欄位拆分成多條,每條包含陣列中的一個值。
$group:將集合中的文件分組,可用於統計結果。
$sort:將輸入文件排序後輸出。
$geoNear:輸出接近某一地理位置的有序文件。

管道操作符例項

1、$project例項
db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );
 這樣的話結果中就只還有_id,tilte和author三個欄位了,預設情況下_id欄位是被包含的,如果要想不包含_id話可以這樣:
 db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

2.$match例項

$match用於獲取分數大於70小於或等於90記錄,然後將符合條件的記錄送到下一階段$group管道操作符進行處理。
db.col.aggregate([
	{$match : { score : { $gt : 70, $lte : 90}}},
	{$group : {_id : null ,count : {$sum :1}}}
])

3.$skip例項

經過$skip管道操作符處理後,前五個文件被"過濾"掉。
db.aggregate(
	{$skip : 5}
)

MongoDB 複製(副本集)(資料同步)

MongoDB複製是將資料同步在多個伺服器的過程。

複製提供了資料的冗餘備份,並在多個伺服器上儲存資料副本,提高了資料的可用性, 並可以保證資料的安全性。

複製還允許您從硬體故障和服務中斷中恢復資料。

什麼是複製?

保障資料的安全性
資料高可用性 (24*7)
災難恢復
無需停機維護(如備份,重建索引,壓縮)
分散式讀取資料

MongoDB複製原理

mongodb的複製至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的資料。

mongodb各個節點常見的搭配方式為:一主一從、一主多從。

主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然後對自己的資料副本執行這些操作,從而保證從節點的資料與主節點一致。

MongoDB複製結構圖如下所示:在這裡插入圖片描述
以上結構圖中,客戶端從主節點讀取資料,在客戶端寫入資料到主節點時, 主節點與從節點進行資料互動保障資料的一致性。

副本集特徵:

N 個節點的叢集
任何節點可作為主節點
所有寫入操作都在主節點上
自動故障轉移
自動恢復

MongoDB副本集設定

在本教程中我們使用同一個MongoDB來做MongoDB主從的實驗, 操作步驟如下:
1、關閉正在執行的MongoDB伺服器。

現在我們通過指定 --replSet 選項來啟動mongoDB。--replSet 基本語法格式如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
例項
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0

以上例項會啟動一個名為rs0的MongoDB例項,其埠號為27017。

啟動後開啟命令提示框並連線上mongoDB服務。

在Mongo客戶端使用命令rs.initiate()來啟動一個新的副本集。

我們可以使用rs.conf()來檢視副本集的配置

檢視副本集狀態使用 rs.status() 命令

副本集新增成員

新增副本集的成員,我們需要使用多臺伺服器來啟動mongo服務。進入Mongo客戶端,並使用rs.add()方法來新增副本集的成員。


rs.add() 命令基本語法格式如下:
>rs.add(HOST_NAME:PORT)
例項
假設你已經啟動了一個名為mongod1.net,埠號為27017的Mongo服務。 在客戶端命令視窗使用rs.add() 命令將其新增到副本集中,命令如下所
>rs.add("mongod1.net:27017")

MongoDB中你只能通過主節點將Mongo服務新增到副本集中, 判斷當前執行的Mongo服務是否為主節點可以使用命令db.isMaster() 。
MongoDB的副本集與我們常見的主從有所不同,主從在主機當機後所有服務將停止,而副本集在主機當機後,副本會接管主節點成為主節點,不會出現當機的情況。

MongoDB 分片

在Mongodb裡面存在另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。
當MongoDB儲存海量的資料時,一臺機器可能不足以儲存資料,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多臺機器上分割資料,使得資料庫系統能儲存和處理更多的資料。

為什麼使用分片

複製所有的寫入操作到主節點
延遲的敏感資料會在主節點查詢
單個副本集限制在12個節點
當請求量巨大時會出現記憶體不足。
本地磁碟不足
垂直擴充套件價格昂貴

分片內容暫時不理解,地址貼上菜鳥

MongoDB 備份(mongodump)與恢復(mongorestore)

MongoDB資料備份

在Mongodb中我們使用mongodump命令來備份MongoDB資料。該命令可以匯出所有資料到指定目錄中。
mongodump命令可以通過引數指定匯出的資料量級轉存的伺服器。

>mongodump -h dbhost -d dbname -o dbdirectory
>-h:
MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017

-d:
需要備份的資料庫例項,例如:test

-o:
備份的資料存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個test目錄,這個目錄裡面存放該資料庫例項的備份資料。

MongoDB資料恢復

mongodb使用 mongorestore 命令來恢復備份的資料。

>mongorestore -h <hostname><:port> -d dbname <path>
>--host <:port>, -h <:port>:
MongoDB所在伺服器地址,預設為: localhost:27017

--db , -d :
需要恢復的資料庫例項,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2

--drop:
恢復的時候,先刪除當前資料,然後恢復備份的資料。就是說,恢復後,備份後新增修改的資料都會被刪除,慎用哦!

<path>:
mongorestore 最後的一個引數,設定備份資料所在位置,例如:c:\data\dump\test。

你不能同時指定 <path> 和 --dir 選項,--dir也可以設定備份目錄。

--dir:
指定備份的目錄

你不能同時指定 <path> 和 --dir 選項。

MongoDB 監控

你必須要了解MongoDB的執行情況,並檢視MongoDB的效能。這樣在大流量得情況下可以很好的應對並保證MongoDB正常運作。
MongoDB中提供了mongostat 和 mongotop 兩個命令來監控MongoDB的執行情況。

mongostat 命令

mongostat是mongodb自帶的狀態檢測工具,在命令列下使用。它會間隔固定時間獲取mongodb的當前執行狀態,並輸出。如果你發現資料庫突然變慢或者有其他問題的話,你第一手的操作就考慮採用mongostat來檢視mongo的狀態。

啟動你的Mongod服務,進入到你安裝的MongoDB目錄下的bin目錄, 然後輸入mongostat命令。

mongotop 命令

mongotop也是mongodb下的一個內建工具,mongotop提供了一個方法,用來跟蹤一個MongoDB的例項,檢視哪些大量的時間花費在讀取和寫入資料。 mongotop提供每個集合的水平的統計資料。預設情況下,mongotop返回值的每一秒。

啟動你的Mongod服務,進入到你安裝的MongoDB目錄下的bin目錄, 然後輸入mongotop命令。
可以選擇帶引數

 E:\mongodb-win32-x86_64-2.2.1\bin>mongotop 10
 後面的10是<sleeptime>引數 ,可以不使用,等待的時間長度,以秒為單位,mongotop等待呼叫之間。通過的預設mongotop返回資料的每一秒。

相關文章