MongoDB學習


1.MongoDB的下載與安裝

  www.mongodb.org 

groupadd -g 27017 mongod 
useradd -g 27017 -u 27017 mongod
mkdir -p /data/db
chown -R mongod.mongod data

2.MongoDB的操作

db  #查看當前數據庫
use db_name  #使用數據庫
show collections;  #查看表的數據
db.getCollectionNames()  #獲取數據庫中所有表的數據
db.mycoll.help();  #查詢對相應表的一些操作
db.tables1.insert({name:"tom",age:"20",address:{add1:"hebei",add2:"wuhan"}});  #新建一張tables1表,並且插入相應的數值
db.mycoll.find().help();  #查詢的方法,排序,最大最小等...
db.tables1.find();  #查看collection tables1的內容
for (i=0;i<1000;i++) db.tables1.insert({name:"Alex"+i});  #向collection tables1中插入1000條數據

db.find()的操作
條件操作
db.mytb1.find({"name":"Alex210"},{"name":1,"age":1,"addr":1}); { "_id" : ObjectId("58bf55e7a0ea941cdc1c6355"), "name" : "Alex210", "age" : 10.5, "addr" : "ShenZhen" }

等價於
select name,age,addr from mytb1 where name="Alex210"
AND操作
db.mytb1.find({"name":"Alex19","age":0.95},{"name":1,"age":1,"addr":1});
等價於
select name,age,addr from mytb1 where name="Alex19" and age="0.95"
OR操作
db.mytb1.find({'$or':[{"name":"Alex19"},{"age":1}]},{"name":1,"age":1,"addr":1});
等價於
select name,age,addr from mytb1 where name="Alex19" or age="1"
比較操作
db.mytb1.find({age:{$gt:10}});
<, <=, >, >= ($lt, $lte, $gt, $gte )
IN操作
db.mytb1.find({"age":{"$in":[10,20,30]}});
等價於
select * from mytb1 where age in (10,20,30)
NIN
db.mytb1.find({"age":{"$nin":[10,20,30]}});
等價於
select * from mytb1 where age not in(10,20,30)
NULL操作
db.mytb1.find({"age":null});
等價於
select * from mytb1 where age is null
LIKE操作
db.mytb1.find({name:/^Alex/});
等價於
select * from mytb1 where name like "Alex%"
DISTINCT操作
db.mytb1.distinct('name');
等價於
select distinct(name) from mytb1
COUNT操作
db.mytb1.find({"age":{"$in":[10,20,30]}}).count();
等價於
select count(*) from mytb1 where age in (10,20,30)
MongoDB可以做數組的操作
EXISTS操作
db.mytb1.find({"age": {$exists:false}});
如果mytb1里面不存在age字段的row打印出來
類型 對應數字 別名 說明
Double1 1 double  
String 2 string  
Object 3 object  
Array 4 array  
Binary data 5 binData  
Undefined 6 undefined 棄用
ObjectId 7 objectId  
Boolean 8 “bool”  
Date 9 “date”  
Null 10 “null”  
Regular Expression 11 “regex”  
DBPointer 12 “dbPointer”  
JavaScript 13 “javascript”  
Symbol 14 “symbol”  
JavaScript(with scope) 15 “javascriptWithScope”  
32-bit integer 16 “int”  
Timestamp 17 “timestamp”  
64-bit integer 18 “long”  
Min key -1 “minKey”  
Max key 127 “maxKey”  
TYPE類型查詢
db.mytb1.find({"age":{$type:1}});
UPDATE操作
db.mytb1.update({name:"Alex19"},{$set:{age:"99"}});

UPDATE更新多條記錄

 db.mytb1.update({name:"Alex19"},{$set:{age:"88"}},false,true);

 db.table_name.update(where,setNew,issert,multi );

  參數解釋:
  where:類似於sql中的update 語句where后邊的查詢條件

  setNew:類似於sql中update語句中set后邊的部分,也就是你要更新的部分

  upsert:如果要更新的那條記錄沒有找到,是否插入一條新紀錄,默認為false不插入,true為插入

  multi :是否更新滿足條件的多條的記錄,false:只更新第一條,true:更新多條,默認為false

UNSET操作
db.mytb1.update({name:"Alex20"},{$unset:{"age":1}});
刪除age這個字段

SET操作

 db.mytb1.update({name:"Alex20"},{$set:{"sex":"girl"}});

 增加sex這個字段

REMOVE操作
db.mytb1.remove({name:"Alex20"});
刪除name="Alex20"的這條記錄

 索引操作

db.tables1.getIndexes();
獲取索引
創建索引
> db.tables1.createIndex({name:1});
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
添加索引以后查詢的速度快了很多。

 

 

MongoDB:
NoSQL、文檔存儲、JSON/BSON

groupadd -g 27017 mongod
useradd -g 27017 -u 27017 mongod

索引分類:
單鍵索引
組合索引(多字段索引)
多建索引:索引是創建在鍵值是子文檔的索引

mongod --help
fork: mongod是否運行在后台
bind_ip: 啟動以后的運行地址,默認為127.0.0.1
port: 監聽端口,默認為27017
maxConns: 並發最大連接數
repair: 進程意外,啟動需要修復數據庫

MongoDB的復制功能:
兩種類型:
master/slave
replica set: 復制集
主節點將數據修改操作保存至oplog中
arbiter: 仲裁節點

復制集中的節點分類:
0優先級的節點: 冷備節點,不會被選舉成為主節點,但是可以參與選舉
被隱藏的從節點:首先必須是0優先級的節點,其次不會被客戶端訪問,但可以參與選舉
延遲復制的從節點:首先必須是0優先級的節點,且復制時間落后於主節點一個固定時長,但可以參與選舉
arbiter: 仲裁節點

MongoDB的復制架構:
oplog: 大小固定的文件,存儲在local數據庫中
初始同步(initial sync)
回滾后追趕(post-rollback catch-up)
切分塊遷移(sharding chunk migrations)
heartbeat

MongoDB的數據同步類型:
初始同步:
從節點沒有任何數據
從節點丟失副本復制歷史

初始同步的步驟:
1、克隆所有數據庫的所有collections
2、應用數據集的所有改變:復制oplog並應用在本地
3、為所有collection構建索引

oplog是用於實現replication的,而journal是用於實現redo的log
復制

rs.add()報錯,沒有關閉防火牆

testSet:PRIMARY> rs.add("192.168.144.47")
{
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: docker46:27017; the following nodes did not respond affirmatively: 192.168.144.47:27017 failed with No route to host",
"code" : 74,
"codeName" : "NodeNotFound"
}
systemctl stop firewalld
systemctl disable firewalld

創建復制集,創建指定的配置文件,啟動的時候指定配置文件啟動

# 日志文件位置
logpath=/data/mongo/mongo.log

bind_ip=127.0.0.1,192.168.144.46

# 以追加方式寫入日志
logappend=true

# 是否以守護進程方式運行
fork = true

# 默認27017
#port = 27017

# 數據庫文件位置
dbpath=/data/mongo

# 啟用定期記錄CPU利用率和 I/O 等待
#cpu = true

# 是否以安全認證方式運行,默認是不認證的非安全方式
#noauth = true
#auth = true

# 詳細記錄輸出
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)用於開發驅動程序時驗證客戶端請求
#objcheck = true

# Enable db quota management
# 啟用數據庫配額管理
#quota = true
# 設置oplog記錄等級
# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog=0

# Diagnostic/debugging option 動態調試項
#nocursors = true

# Ignore query hints 忽略查詢提示
#nohints = true
# 禁用http界面,默認為localhost:28017
#nohttpinterface = true

# 關閉服務器端腳本,這將極大的限制功能
# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true
# 關閉掃描表,任何查詢將會是掃描失敗
# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true
# 關閉數據文件預分配
# Disable data file preallocation.
#noprealloc = true
# 為新數據庫指定.ns文件的大小,單位:MB
# Specify .ns file size for new databases.
# nssize = 

# Replication Options 復制選項
# in replicated mongo databases, specify the replica set name here
replSet=testSet replIndexPrefetch=_id_only
# maximum size in megabytes for replication operation log
#oplogSize=1024
# path to a key file storing authentication info for connections
# between replica set members
#指定存儲身份驗證信息的密鑰文件的路徑
#keyFile=/path/to/keyfile

MongoDB:
NoSQL、文檔存儲、JSON/BSON

groupadd -g 27017 mongod
useradd -g 27017 -u 27017 mongod

索引分類:
單鍵索引
組合索引(多字段索引)
多建索引:索引是創建在鍵值是子文檔的索引

mongod --help
fork: mongod是否運行在后台
bind_ip: 啟動以后的運行地址,默認為127.0.0.1
port: 監聽端口,默認為27017
maxConns: 並發最大連接數
repair: 進程意外,啟動需要修復數據庫

MongoDB的復制功能:
兩種類型:
master/slave
replica set: 復制集
主節點將數據修改操作保存至oplog中
arbiter: 仲裁節點

復制集中的節點分類:
0優先級的節點: 冷備節點,不會被選舉成為主節點,但是可以參與選舉
被隱藏的從節點:首先必須是0優先級的節點,其次不會被客戶端訪問,但可以參與選舉
延遲復制的從節點:首先必須是0優先級的節點,且復制時間落后於主節點一個固定時長,但可以參與選舉
arbiter: 仲裁節點

MongoDB的復制架構:
oplog: 大小固定的文件,存儲在local數據庫中
初始同步(initial sync)
回滾后追趕(post-rollback catch-up)
切分塊遷移(sharding chunk migrations)
heartbeat

MongoDB的數據同步類型:
初始同步:
從節點沒有任何數據
從節點丟失副本復制歷史

初始同步的步驟:
1、克隆所有數據庫的所有collections
2、應用數據集的所有改變:復制oplog並應用在本地
3、為所有collection構建索引

oplog是用於實現replication的,而journal是用於實現redo的log
復制

rs.add()報錯,沒有關閉防火牆

testSet:PRIMARY> rs.add("192.168.144.47")
{
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: docker46:27017; the following nodes did not respond affirmatively: 192.168.144.47:27017 failed with No route to host",
"code" : 74,
"codeName" : "NodeNotFound"
}
systemctl stop firewalld
systemctl disable firewalld


"stateStr" : "(not reachable/healthy)",節點狀態不對,也是防火牆的問題


在56上
> rs.status()
{
"info" : "run rs.initiate(...) if not yet done for the set",
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}
>
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "192.168.144.56:27017",
"ok" : 1
}

testSet:PRIMARY> rs.add("192.168.144.46");
{ "ok" : 1 }
testSet:PRIMARY> rs.add("192.168.144.47");
{ "ok" : 1 }

testSet:SECONDARY> show dbs
2017-03-15T06:48:43.988-0400 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:755:19
shellHelper@src/mongo/shell/utils.js:645:15

手工將Primary設置為Secondary,執行stepDown()

對於副本集的重新選舉的影響條件:
心跳信息
優先級
optime:optime必須是最新的,不能落后於其他節點
網絡連接
網絡分區

選舉機制:
出發選舉的事件:
新副本集初始化時
從節點聯系不到主節點時
主節點“下台”時:主幾點收到stepDown()/某從節點有更高的優先級,且已經滿足成為主節點的其他所有條件
主節點無法聯系到副本集的“多數方”

設置節點的優先級:
只能在主節點上執行命令
cfg=rs.conf()
cfg.members[2].priority=2
rs.reconfig(cfg);

MongoDB的分片:
MySQL分片:Gizzard,HiveDB,MySQL+HScale,Hibernate Shard

分片架構中的角色:
mongos: Router
config: 元數據服務器
shard:數據節點,也稱mongod實例節點

基於范圍切片:range
基於列表切片:list
基於HASH切片:

添加mongodb的啟動停止腳本

cd /etc/init.d/
[root@docker46 init.d]# cat mongodb #!/bin/bash # #chkconfig: 2345 80 90 #description: mongodb start() { su - mongod -c "/data/mongodb/bin/mongod -f /data/mongo/mongodb.cnf" } stop() { su - mongod -c "/data/mongodb/bin/mongod -f /data/mongo/mongodb.cnf --shutdown" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac

chkconfig --add mongodb
chmod +x  mongodb
chkconfig mongodb on

 

 

 

 

 

 

 

  


免責聲明!

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



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