mongodb基本命令,mongodb集群原理分析


mongodb基本命令,mongodb集群原理分析

集合:

1、集合沒有固定數據格式。

2、

數據:

時間類型:

Date() 當前時間(js時間)

new Date() 格林尼治時間(object)

ISODate() 格林尼治時間(object)

轉換:

new Date()/ISODate().toLocaleString() 轉為本地時間Date()

new Date()/ISODate().valueOf() 轉為時間戳

ID:

mongodb每個文檔必須有一個_id鍵

默認_id = ObjectId()(對象)

命令:

數據庫:

use db_n 使用庫

db db_n 顯示庫名

show dbs 查看所有庫

use database_name 刪除庫

->db.dropDatabase()

集合:

show collections 查看全部集合

db.createCollection("name", {options}) 創建集合

options:

capped 布爾 true固定集合,須指定size,默認false

size int 固定長度,超過后自動覆蓋最早的文檔,優先級大於max

autoIndexId 布爾 true自動在_id創建索引,默認true

max int 固定集合包含文檔最大數量

db.c_n/db.getCollection("c_n") 使用集合

db.c_n.drop() 刪除集合

固定集合:

db.createCollection("log",{capped: true, size: 10000, max: 5000}) 創建限制集合

db.isCapped() 是否為限制集合

db.runConmand({"convertToCapped": "mycoll", size: 100000}) 將集合轉化為限制集

操作符:

$ 代表自己

文檔:

pretty() 格式化讀取

-------------------------------------------------------------------------------------------------------------------------

查詢文檔:

db.c_n.find({},{指定字段}) 查詢文檔 ({}中兩個同名鍵,前面查詢會被覆蓋)

-----

db.c_n.find({},{aa:1,_id:0}) 指定aa字段,排除_id(_id默認會顯示)

-----

aa:{$type:1} aa為數字類型

-----

aa: 1 aa = 1

aa:{$lt:50} aa<50

aa:{$lte:50} aa<=50

bb:{$gt:50} bb>50

bb:{$gte:50} bb>=50

bb:{$ne:50} bb!=50

aa:{$gte:10,$lte:20} 10<=aa<=20

aa:{$eq:20} aa=20

aa:{$in: [0,1,2,3] } aa in[]

aa:{$nin: [0,1,2,3] } aa not in[]

-----

$or:[{aa:1},{aa:2}] or

$and:[{},{}] and

$not:{$gt:2} not in (aa>2)

$nor:[] not or

$where:function(){

if(this.age>18){

return true;

}

return false;

}

/

$where:"this.age > 18" 自定義函數邏輯篩選

 

分頁:

db.c_n.find().limit(2) 只查前2條

db.c_n.find().skip(2) 跳過前2條

排序:

db.c_n.find().sort({aa:1,bb:-1}) 排序,aa升序,bb降序

嵌套:

db.c_n.find({"aa.x":2}) 查詢x符合的數據

一個:

db.c_n.findOne({}) 查詢一個

正則:

aa:/你/ 包含 你

aa:/^你/ 以 你 開頭

aa:/你$/ 以 你 結尾

游標:

var aa = db.c_n.find()

aa.hasNext()

aa.next()

 

-------------------------------------------------------------------------------------------------------------------------

插入文檔:

db.c_n.insert(

[ {},{},{} ]/{} ,

{

writeConcern: <document> ,

ordered: <boolean>(是否按順序插入,默認true順序添加,出錯后面無法添加/false不嚴格順序,中間一條錯誤后面也能添加)

}

) 插入文檔

 

db.c_n.insertOne({}) 插入一個文檔

{ "acknowledged" : true, "insertedIds" : [ ObjectId("562a94d381cb9f1cd6eb0e1a"), ] } 返回值

 

db.c_n.insertMany(

[ {},{},{} ] ,

{

writeConcern: <document> ,

ordered: <boolean>(是否按順序插入,默認true順序添加,出錯后面無法添加/false不嚴格順序,中間一條錯誤后面也能添加)

}

) 批量(數組形式)添加

{

"acknowledged" : true,

"insertedIds" : [

ObjectId("5ccaa77a8467059db6186d23"),

ObjectId("5ccaa77a8467059db6186d24"),

ObjectId("5ccaa77a8467059db6186d25")

]

} 批量(數組形式)返回值

-------------------------------------------------------------------------------------------------------------------------

批量操作:

如果一個執行list 包含添加、更新 、刪除操作 ,mongodb 會把操作分成三個組:第一個 執行insert 操作 第二個執行更新操作  第三個執行刪除操作。

var bulk = db.test.initializeOrderedBulkOp();

bluk.insert();

bluk.update();

bluk.find({}).remove();

bluk.getOperations();(查看分組情況) 

bluk.execute();(提交) 批量操作(指令)

返回: "batchType" : 1, //1 insert 2 update 3 remove

-------------------------------------------------------------------------------------------------------------------------

db.c_n.save({}) 插入(無_id)/修改(全部替換)

-------------------------------------------------------------------------------------------------------------------------

修改文檔:

db.c_n.update(

{

<query>

},

{

<update>

},

{

upsert: <boolean>(不存在記錄是否插入 false(默認)不插入/true插入),

multi: <boolean>(false(默認)更新第一條數據/true更新所有匹配數據),

writeConcern: <document>

}

) 修改文檔字段

修改符號:

$inc:{aa: 1} 將aa加1

$set:{aa: 2} 把aa字段改為2

$unset:{cc: 1} 將cc字段刪除

$push:{aa: 2} (數組)將2添加到aa數組,若不存在數組則自動創建

$pushAll:{aa:[c]} (數組)將c數組添加到aa數組后

$addToSet:{aa:2} (數組)將2添加到數組,2在數組不存在時才添加

$pop:{aa:-1/1} (數組)刪除數組最前面、最后面的一個值

$pull:{aa:2} (數組)刪除數組中為2的值

$pullAll:{aa:[1,2]} (數組)刪除數組批量值

$rename:{old:new} 重命名鍵

-------------------------------------------------------------------------------------------------------------------------

刪除文檔:

db.c_n.remove(

{<query>},

{

justOne:<boolean>(是否刪除首個 false(默認)/true),

writeConcern:<document>

}

) 刪除文檔

db.c_n.remove({}) 刪除所有文檔

-------------------------------------------------------------------------------------------------------------------------

類型篩選:

aa:{$type}

typeof 指定類型

-------------------------------------------------------------------------------------------------------------------------

索引:

db.c_n.createIndex(keys,options) 創建單個索引

db.c_n.createIndex({k1,k2,k3},{op}) 創建復合索引1

// db.c_n.ensureIndex({k1,k2,k3},{op}) 創建復合索引2(mongodb3.0開始廢棄)

db.c_n.dropIndexes()/dropIndex("_name") 刪除索引

db.c_n.getIndexes()/getIndex("_name") 查看索引

db.c_n.totalIndexSize() 索引大小

稀疏索引:

db.c_n.creatIndex({aaa:1},{name:"index1", sparse: true})

非阻塞建立索引:

db.c_n.creatIndex({},{background: true})

唯一索引:

db.c_n.creatIndex({},{unique: true})

TTL(只對時間類型有效):

db.createIndex({},{expireAfterSeconds: 60})

地理空間索引:

db.createIndex({"_name":"2d"})

數據結構:_name:{k1:120,k2:38} 或 _name:[120,38]

地理最近:

find({_name:{$near:[x,y]}}) (默認返回100個)

db.runCommand({geoNear:"c_n",near:[130,38],num:2}) (返回dis距離,stats狀態)

*形狀范圍:

$within

內嵌文檔:

db.c_n.createIndex("aaa.xxx",options)

索引排序:

若未對目標字段建立索引,mongodb將會把所有數據提取到內存進行排序,無索引排序使用個數限制的。

注意:

1、聯合索引最左綴匹配原則,多條件查詢有效。

2、單列多個索引只用到最左邊那個。

 

-------------------------------------------------------------------------------------------------------------------------

統計函數:

db.runCommand({'distinct':'c_n','key':'fied','query':{}})

db.c_n.find({query}).limit(n).count(true/非0) 條件篩選后的數量

db.c_n.count({query}) 數量

db.c_n.distinct(“fied”,{query}) 去重

db.c_n.group({key,reduce,initial[,keyf][,cond][,finalize]}) 分組(最多返回20000個)

分組統計:https://blog.csdn.net/iteye_19607/article/details/82644559

db.c_n.group({

"key":{"k1":true}

"initial":{}

"$reduce":function(){

 

}

"condition":{query}

})

注意:

db.collection.group()使用JavaScript,它受到了一些性能上的限制。大多數情況下,$ groupAggregation Pipeline提供了一種具有較少的限制適用的替代。可以通過指定的鍵的集合中的文檔和執行簡單的聚合函數

-------------------------------------------------------------------------------------------------------------------------

聚合查詢:https://www.cnblogs.com/zhoujie/p/mongo1.html (結果限制大小16m)

db.c_n.aggregate([{ag1},{ag2}]) 聚合查詢

$match:{query} 匹配條件

$sort:{aa:1/-1} 排序

$limit:10 輸出條數

$skip:20 跳過條數

$unwind:"$aa" 將數組拆分

$out:"c_n" 將結果集遷移到c_n

$group *分組

$group:{_id:"$name",bbb:{$sum:1}}

_id:"$name" 指定分組字段,並以_id鍵返回數據

$sum 記錄每組數據個數

 

 

 

-------------------------------------------------------------------------------------------------------------------------

結果重塑:

 

-------------------------------------------------------------------------------------------------------------------------

統計例子:

 

-------------------------------------------------------------------------------------------------------------------------

查詢分析:

1、開啟profile功能(慢查詢記錄):

db.getProfilingLevel() 返回level 值0關閉/1慢日志/2

db.setProfilingLevel(level,50(ms)) 記錄大於50ms的日志

db.system.profile.find() 查詢慢日志

-------------------------------------------------------------------------------------------------------------------------

mongo數據導入導出:

備份/恢復:mongodump/mongorestore

內存日志:journal:db文件下的journal目錄

journalCommitInterval = 200 啟動項配置journal刷新時間

導入/導出集合:mongoimport/mongoexport

-------------------------------------------------------------------------------------------------------------------------

mongodb集群:

0、副本集原理:

a.一個為主節點,其余的都為從節點。

b.主節點上能夠完成讀寫操作,從節點僅能用於讀操作。

c.同步:

(1)第一次啟動,刪除除了local以外的庫,數據全量同步。

(2)同步后,各個從節點通過主節點oplog來復制數據並應用於本地。

(3)宕機或者oplog操作大於一輪未同步,數據全量同步。

(4)從節點通過檢查本地oplog最新點和主節點最久點作比較,同步操作。

(5)oplogSize設置較大值避免全量同步。

d.主節點需要記錄所有曾刪改操作,這些記錄保存在local庫的oplog文件。

e.oplog:包括:ts時間、op操作類型、ns集合、o文檔

(1)oplog為固定集合,超過oplogSize舊值會被覆蓋。

(2)oplog 具有冪等性,即無論執行幾次其結果一致(例如多次增加)

(3)oplog包含一個遞增的序號來記錄操作的時效性。

f.集群中的各節點還會通過傳遞心跳(默認2s)信息來檢測各自的健康狀況。

g.主節點選舉:

(1)投票,優先級最高的(優先級相同時數據最新的)為主節點。

(2)主節點通過心跳判斷集群中多少節點對其可見,小於一半時降級。

(4)選舉成功后集群以主節點oplog為最新數據,其他節點的操作都會回

滾,所有節點連接新的活躍節點后要重新同步。這些節點會查看自己的

oplog,找出其中活躍節點沒有執行過的操作,然后向活躍節點請求這些操

作影響的文檔的最新副本。正在執行重新同步的節點被視為恢復中,在完

成這個過程前,不能成為活躍節點候選者。

(3)參與選舉節點數必須大於副本總節點數的一半,如果小於一半則所有

節點變成只讀狀態。

h.推薦MongoDB副本節點最少為3,建議副本集成員為奇數,最多12個副

本節點,最多7個節點參與選舉,過多時會增加復制壓力。

i.所有的Secondary都宕機了,只剩下Primary。最后Primary會變Secondary,

不能提供服務。

1、副本集群管理:

rs.:副本命令,是replSet是縮寫,代表副本集。

config={"_id":"shard1", "members":[

{"_id":1,"host":"120.77.37.94:27017","priority":1}

,{"_id": 2,"host":"47.107.174.213:27017","priority":2}

,{"_id": 3,"host":"132.232.156.103:27017","arbiterOnly":true(只作為仲裁節點)}] }

rs.initiate(config)

 

rs.status() //查看成員的運行狀態等信息

rs.config() //查看配置信息

*rs.slaveOk() //允許在SECONDARY節點上進行查詢操作,默認從節點不具有查詢

功能

rs.isMaster() //查詢該節點是否是主節點

rs.add({"ip:port"}) //添加新的節點到該副本集中

rs.remove({"ip:port"}) //從副本集中刪除節點

 

2、主從復制:

--only             從節點指定復制某個數據庫,默認是復制全部數據庫

--slavedelay       從節點設置主數據庫同步數據的延遲(單位是秒)

--fastsync         從節點以主數據庫的節點快照為節點啟動從數據庫

--autoresync       從節點如果不同步則從新同步數據庫(即選擇當通過熱添加了一台從服務器之后,從服務器選擇是否更新主服務器之間的數據)

--oplogSize        主節點設置oplog的大小(主節點操作記錄存儲到local的oplog中)

主節點:

master=true #開啟主節點

從節點:

slave=true #開啟從節點

source 120.77.37.94:27017 #指定主節點

*shell添加主節點:

use local

db.sourse.insert({"host","120.222.222.22"})

*shell刪除主節點:

db.sourse.remove({"host","120.222.222.22"})

3、切片集群:http://www.lanceyan.com/tech/arch/mongodb_shard1.html

注:切片權限和副本集權限是分開管理的。

 

 

-------------------------------------------------------------------------------------------------------------------------

mongodb引擎:mongod  --storageEngine mmapv1

1、wiredTiger引擎:3.0新增,3.2之后默認引擎。官方宣稱在read、insert和復雜的

update下具有更高的性能。

(1)所有的write請求都基於“文檔級別”的lock。

(2)通過在配置文件中指定“cacheSizeGB”參數設定引擎使用的內存量,此內存用於

緩存工作集數據(索引、namespace,未提交的write,query緩沖等)。

(3)wiredTiger每隔60秒(默認)或者待寫入的數據達到2G時,將內存中的數據變更

flush到磁盤中的數據文件中,並做一個標記點。

(4)對於write操作,首先被持久寫入journal,然后在內存中保存變更數據。journal日

志默認每個100毫秒同步磁盤一次,每100M數據生成一個新的journal文件,journal

默認使用了snappy壓縮,檢測點創建后,此前的journal日志即可清除。

2、MMAPv1引擎:

(1)所有的write請求都基於“collection”的lock。

(2)將數據文件映射到內存中。

-------------------------------------------------------------------------------------------------------------------------

mongodb版本:

3.2聯合查詢 look up / mongoose

4.0多文檔事物 http://www.mongoing.com/archives/5560

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM