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,它受到了一些性能上的限制。大多數情況下,$ group在Aggregation 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