介紹
MongoDB是一個文檔數據庫引擎,文檔數據庫和MySQL這種關系型數據庫是不一樣的設計,文檔數據庫和Redis這種Key-Value數據庫也有很大差別。不過文檔數據庫和Key-Value數據庫都屬于NoSQL型的數據庫,也就是說MongoDB也是不支持SQL語句的。
MongoDB相對于MySQL數據庫來說有一項獨有的非常強大的特點,就是MongoDB的數據表結構是自由的,可以針對每一個文檔(一行數據)定義不同的字段。
MongoDB的文檔的存儲格式是主流的數據個數JSON,JSON數據是可以設計成一個樹狀結構的,可以將一個對象的屬性以及子屬性、孫屬性甚至更具體的屬性保存到一個JSON數據當中,而MongoDB的一個文檔就可以保存它,而無需事先設計好數據表結構來適應這種對象。
安裝環境
CentOS:CentOS Linux release 7.6.1810 (Core)Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
軟件版本
mongodb-linux-x86_64-rhel70-4.2.2.tgz
本地化
如果是新環境,我們需要設置時區以保證時間顯示正確
timedatectl set-timezone Asia/Shanghai
安裝wget
如果環境里沒有wget,通過yum安裝一下
yum -y install wget
安裝依賴包
yum -y install libaio numactl-libs
建立環境根目錄
mkdir -p /tongfu.net/env/
建立安裝包目錄并進入
mkdir /packages
cd /packages
官網下載
從官網下載
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.2.tgz
網盤下載
如果官網下載太慢,可以從網盤下載
鏈接: https://pan.baidu.com/s/1KjL759qM81Ix_ZRZZxdepg 提取碼: yvpi
安裝
設置mongo環境變量
[root@tfdev env]# vi /etc/profile
export MONGODB_HOME=/tongfu.net/env/mongodb-4.2.2
export PATH=$MONGODB_HOME/bin:$PATH
立即啟用環境變量
source /etc/profile
創建用戶
useradd mongo
解壓縮
tar -xzvf mongodb-linux-x86_64-rhel70-4.2.2.tgz -C /tongfu.net/env/
cd /tongfu.net/env/
mv mongodb-linux-x86_64-rhel70-4.2.2/ mongodb-4.2.2
建立數據目錄
mkdir /tongfu.net/env/mongodb-4.2.2/conf
mkdir /tongfu.net/env/mongodb-4.2.2/data
mkdir /tongfu.net/env/mongodb-4.2.2/logs
建立配置文件
[root@tfdev env]# vi /tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf
dbpath = /tongfu.net/env/mongodb-4.2.2/data/
logpath = /tongfu.net/env/mongodb-4.2.2/logs/mongodb.log
bind_ip = 0.0.0.0
wiredTigerCacheSizeGB = 2
auth = true
journal = true
設置權限
chown mongo.mongo -R /tongfu.net/env/mongodb-4.2.2/
自動啟動
添加自動啟動腳本
[root@tfdev env]# cat > /lib/systemd/system/mongod.service <<EOF
[Unit]
Description=mongod
After=network.target
[Service]
Type=forking
User=mongo
Group=mongo
ExecStart=/tongfu.net/env/mongodb-4.2.2/bin/mongod -f /tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf --fork
ExecStop=/tongfu.net/env/mongodb-4.2.2/bin/mongod -f /tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
運行自動啟動
systemctl enable mongod # 設置自動啟動
systemctl start mongod # 啟動服務
systemctl stop mongod # 停止服務
systemctl restart mongod # 重啟服務
服務命令添加到系統目錄
ln -s /tongfu.net/env/mongodb-4.2.2/bin/mongo /usr/bin/
連接數據庫admin
首次登錄,無需用戶名和密碼,直接連接 admin 數據庫
/tongfu.net/env/mongodb-4.2.2/bin/mongo 127.0.0.1:27017/admin
創建超級用戶
設置超級用戶root
db.createUser(
{
user:"root",
pwd:"abcdef",
roles: [
{ role:"readWriteAnyDatabase", db:"admin" },
{ role:"userAdminAnyDatabase", db:"admin" },
{ role:"dbAdminAnyDatabase", db:"admin" }
]
}
);
重新連接數據庫admin
使用超級用戶root連接數據庫admin
/tongfu.net/env/mongodb-4.2.2/bin/mongo -uroot -pabcdef 127.0.0.1:27017/admin
創建數據庫
創建數據 field
use field
插入一條數據到表 field
db.field.insert({"id":1,"uName":"蘿卜","age":21})
查詢表 field 的所有數據
db.field.find()
插入一條數據到表 logs
db.logs.insert({"id":1,"event":"create record"})
查看所有數據庫
show dbs
查看所有數據表(集合)
show collections
總結
導出數據
通過下面的命令導出整個數據庫
mongodump -u $user -p $passwd -h $host --port $port -d $dbname -o $backupDir
導入數據
通過下面的命令恢復整個數據庫
注意:備份出來的目錄下面會有備份的數據庫的文件夾,要指定到這一級才行
mongorestore -u $user -p $passwd -h $host --port $port -d $dbname $backupDir/$dbname
創建用戶
使用無認證模式啟動mongod
選擇admin數據庫
use admin
創建root用戶
db.createUser(
{
user:"root",
pwd:"123456",
roles: [ { role:"userAdminAnyDatabase", db:"admin" },{ role:"dbAdminAnyDatabase", db:"admin" },{ role:"readWriteAnyDatabase", db:"admin" } ]
}
)
使用認證模式重啟mongod
用root登錄到admin
/tongfu.net/env/mongodb-3.6.2/bin/mongo -u root -p 123456 admin
選擇test數據庫
use test
為test庫創建用戶test
db.createUser(
{
user:"test",
pwd:"123456",
roles: [ { role:"dbAdmin", db:"test" },{ role:"readWrite", db:"test" } ]
}
)
退出root登錄
使用test登錄到test
/tongfu.net/env/mongodb-3.6.2/bin/mongo -u test -p 123456 test
修改用戶
用root登錄到admin
/tongfu.net/env/mongodb-3.6.2/bin/mongo -u root -p 123456 admin
選擇test數據庫
use test
修改密碼
db.updateUser(
'test',
{
pwd:"654321"
}
)
刪除用戶
用root登錄到admin
/tongfu.net/env/mongodb-3.6.2/bin/mongo -u root -p 123456 admin
選擇test數據庫
use test
刪除test(居然可以刪自己!!!)
db.dropUser('test')
查看用戶列表
1、登錄到admin數據庫
2、選擇admin數據庫
use admin
3、查看用戶列表
db.system.users.find()
總結
用戶角色
Read:允許用戶讀取指定數據庫
readWrite:允許用戶讀寫指定數據庫
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級賬號,超級權限
認證失敗的解決方法
剛剛安裝好的環境,使用MongoClient去連接服務器,結果死活報認證錯誤。明明是正確的用戶名,密碼,數據啊~~
從網上查發現舊版本的mongo擴展用的是 MONGODB-CR認證方式。而最新版的MongoDB服務器得用Scram-SHA-1認證方式
好吧,升級mongo擴展到1.6.13,解決了~~
示例
// 引入adodbj包,adodbj為JSON行數據庫的統稱
linking('dbj.adodbj');
// 連接MongoDB服務器
$myDbjObj = new adodbj("driver=mongo;server=localhost;port=27017;uid=field;pwd=abcdef;database=field;charset=utf-8;");
// 查看數據庫列表(需要有訪問admin的權限)
//$dbArr = $myDbjObj->getDbs(); var_dump($dbArr);
$condArr = array(
'domainName'=>array('$regex'=>"ali213" ,'$options'=>"iq"),
);
// 查詢數據數量
$ret = $myDbjObj->count("urls", $condArr); $this->showRet($ret, "count");
// 查詢所有數據
$ret = $myDbjObj->search("urls", $condArr, 0, 10, array('_id'=>-1, 'domainName'=>-1));
foreach ($ret as $itm){
$this->showRet($itm, "search");
}
// 添加記錄,ID為1
$ret = $myDbjObj->add("urls", array('domainName'=>"www.ali213.net ". rand(1111, 9999) ), 1); $this->showRet($ret, "add");
// 手動添加1000條數據,ID為1+$i
for($i=0;$i<1000;$i++){
$ret = $myDbjObj->mod("urls", $i+1, array('domainName'=>"www.ali213.net ". rand(1111, 9999), 'idx'=>rand(111, 999) ) ); ///$this->showRet($ret, "mod");
}
// 通過mod修改一條數據,ID為1
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('weight'=>33)); $this->showRet($ret, "modRange");
// 查看數據,ID為1
$ret = $myDbjObj->get("urls", 1); $this->showRet($ret, "get");
// 查看索引
$ret = $myDbjObj->getIndexes("urls"); $this->showRet($ret, "get indexes");
// 創建索引
$ret = $myDbjObj->createIndex("urls", array('domainName'=>1)); $this->showRet($ret, "create index");
// 刪除索引
$ret = $myDbjObj->dropIndex("urls", array('domainName'=>1)); $this->showRet($ret, "drop index");
// 清除所有索引
$ret = $myDbjObj->dropIndexes("urls"); $this->showRet($ret, "drop indexes");
概念
新版本的MongoDB驅動完全變了樣,一般情況下我們還是喜歡用舊版本的對象怎么辦呢?沒有關系,官方提供了一個第三方PHP庫,封裝了新版本的PHP擴展的對象,和老版本的對象及其相似我們TFAPI也將這個庫引入了進來,放到了 driver/mongo 下
使用技巧
// 引入adodbj包,adodbj為JSON行數據庫的統稱
linking('dbj.adodbj');
// 連接MongoDB服務器,注意:這里的 driver 是 mongo2 不是 mongo 了!!
$myDbjObj = new adodbj("driver=mongo2;server=localhost;port=27017;uid=field;pwd=abcdef;database=field;charset=utf-8;");
// 查看數據庫列表(需要有訪問admin的權限)
//$dbArr = $myDbjObj->getDbs(); var_dump($dbArr);
$condArr = array(
'domainName'=>array('$regex'=>"ali213" ,'$options'=>"iq"),
);
// 查詢數據數量
$ret = $myDbjObj->count("urls", $condArr); $this->showRet($ret, "count");
// 查詢所有數據
$ret = $myDbjObj->search("urls", $condArr, 0, 10, array('_id'=>-1, 'domainName'=>-1));
foreach ($ret as $itm){
$this->showRet($itm, "search");
}
// 添加記錄,ID為1
$ret = $myDbjObj->add("urls", array('domainName'=>"www.ali213.net ". rand(1111, 9999) ), 1); $this->showRet($ret, "add");
// 手動添加1000條數據,ID為1+$i
for($i=0;$i<1000;$i++){
$ret = $myDbjObj->mod("urls", $i+1, array('domainName'=>"www.ali213.net ". rand(1111, 9999), 'idx'=>rand(111, 999) ) ); ///$this->showRet($ret, "mod");
}
// 通過mod修改一條數據,ID為1
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('weight'=>33)); $this->showRet($ret, "modRange");
// 查看數據,ID為1
$ret = $myDbjObj->get("urls", 1); $this->showRet($ret, "get");
// 查看索引
$ret = $myDbjObj->getIndexes("urls"); $this->showRet($ret, "get indexes");
// 創建索引,只能一個一個創建了
$ret = $myDbjObj->createIndex("urls", array('domainName'=>1)); $this->showRet($ret, "create index 1");
$ret = $myDbjObj->createIndex("urls", array('visits'=>2)); $this->showRet($ret, "create index 2");
// 刪除索引,只能一個一個刪除了
$ret = $myDbjObj->dropIndex("urls", 'domainName_1'); $this->showRet($ret, "drop index 1");
$ret = $myDbjObj->dropIndex("urls", 'visits_2'); $this->showRet($ret, "drop index 2");
// 清除所有索引
$ret = $myDbjObj->dropIndexes("urls"); $this->showRet($ret, "drop indexes");
第一批
// 特殊查詢語句示例
// select * from urls where url = 'http://tfapi.tongfu.net/'
$myDbjObj->search("urls", array('url'=>"http://tfapi.tongfu.net/"));
// select * from urls where url like 'tongfu.net'
$myDbjObj->search("urls", array('url'=>array('$regex'=>"tongfu.net")));
// select * from urls where visit > 100 and visit < 1000
$myDbjObj->search("urls", array('visit'=>array('$gt'=>100, '$lt'=>1000)));
// select * from urls where weight between 3 and 5
$myDbjObj->search("urls", array('weight'=>array('$gte'=>3, '$lte'=>5)));
// select * from urls where urlType <> 'res'
$myDbjObj->search("urls", array('urlType'=>array('$ne'=>"res")));
// select * from urls where urlMediaType in ('avi', 'rmvb', 'rm')
$myDbjObj->search("urls", array('urlMediaType'=>array('$in'=>array("avi","rmvb","rm"))));
// select * from urls where urlMediaType not in ('mov', 'mp4')
$myDbjObj->search("urls", array('urlMediaType'=>array('$nin'=>array("mov","mp4"))));
// select * from urls where catchTool = 'bd' or catchTimes > 0
$myDbjObj->search("urls", array('$or'=>array('catchTool'=>"bd", 'catchTimes'=>array('$gt'=>0))));
$myDbjObj->search("urls", array('urlExtension'=>array('$all'=>array("img","js","css"))));
第二批
// select * from urls where (_id mod 5) = 1
$myDbjObj->search("urls", array('_id'=>array('$mod'=>array(5, 1))));
// select * from urls where not (catchTimes < 100)
$myDbjObj->search("urls", array('$not'=>array('catchTimes'=>array('$lt', 100))));
// 數組中元素同時包含full head
$myDbjObj->search("urls", array('catchType'=>array('$all'=>array('full', 'head'))));
// 數組中第2個元素為head
$myDbjObj->search("urls", array('catchTypes.1'=>"head"));
// 數組元素個數是5個
$myDbjObj->search("urls", array('catchTypes'=>array('$size'=>5)));
// 嵌套查詢
$myDbjObj->search("urls", array('catchInfo.status'=>"fail", 'catchInfo.datetime'=>"2018-1-26 15:12:11"));
// 嵌套查詢,假定元素是數組的情況下
$myDbjObj->search("urls", array('catchInfo',array('$elemMatch'=>array('status'=>"fail", 'datetime'=>"2018-1-26 15:12:11"))));
// 復雜查詢情況(這種方式效率比較慢)
// 盡量依照 正則 > MapReduce > $where 這個順序設計
$myDbjObj->search("urls", array('$where',"catchTimes > 0 and catchType == 'head'"));
$myDbjObj->search("urls", array('$where',"function(){ var result = catchTimes > 0 and catchType == 'head'; return result; }"));
// 排序,分頁實現
// 根據_id反序排列,同時從100行開始取10行數據
$myDbjObj->search("urls", array(), 100, 10, array('_id'=>-1));
第三批
// 將鍵weightNum的值進行數字增減操作(只能是數字類型)
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$inc'=>array('weightNum'=>1))); $this->showRet($ret, "modRange $inc");
// 向滿足條件的文檔設置鍵weightStr值為high(支持嵌套,請使用點符號)
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$set'=>array('weightStr'=>"high"))); $this->showRet($ret, "modRange $set");
// 從滿足條件的文檔刪除鍵weight.x(支持嵌套,請使用點符號)
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$unset'=>array('weightStr'=>1))); $this->showRet($ret, "modRange $unset");
// 向滿足條件的文檔的鍵weightRecord數組追加元素值為s1(不檢查重復性)(支持嵌套,請使用點符號)
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$push'=>array('weightRecord'=>"s1"))); $this->showRet($ret, "modRange $push");
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$push'=>array('weightRecord'=>"s1"))); $this->showRet($ret, "modRange $push");
// 向滿足條件的文檔的鍵weightRecord數組追加元素值為s1(檢查重復性)(支持嵌套,請使用點符號)
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$addToSet'=>array('weightRecord'=>"s1"))); $this->showRet($ret, "modRange $addToSet");
// 向滿足條件的文檔的鍵weightRecord數組追加一組元素
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$addToSet'=>array('weightRecord'=>array('$each'=>array("s1","s2","s3"))))); $this->showRet($ret, "modRange $each");
// 使用$pop對鍵weightRecord數組進行刪除元素操作
// 刪除數組最后位置元素
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$pop'=>array('weightRecord'=>1))); $this->showRet($ret, "modRange $pop");
// 刪除數組最后位置元素
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$pop'=>array('weightRecord'=>-1))); $this->showRet($ret, "modRange $pop");
// 刪除數組最后位置元素
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$pop'=>array('weightRecord'=>0))); $this->showRet($ret, "modRange $pop");
// 刪除數組匹配條件的元素
$ret = $myDbjObj->modRange("urls", array('_id'=>1), array('$pull'=>array('weightRecord'=>"s2"))); $this->showRet($ret, "modRange $pull");
https://m.tongfu.net/home/35/blog/100588.html
下載地址如下:
https://www.mongodb.com/try/download/community
選擇適合自己系統的安裝包進行點Download進行下載
1.雙擊安裝包進行安裝
2.點擊I accept the tems in the license agreement,點擊Next
3.選擇默認安裝路徑,點擊completem;自定義安裝路徑,點擊custom,點擊browse選擇路徑,點擊next;這里我的安裝路徑是:D:\mongodb
4.取消勾選install MongoDB compass,不要勾選,這是圖形界面,點擊Next;后續我們可以自行下載安裝MongoDB compass這個圖像界面,MongDB compass圖形界面下載地址:https://www.mongodb.com/try/download/compass
5.點擊install ;
6.點擊finish,完成安裝;
環境變量的配置
首先,進到mongodb的安裝目錄下,找到bin文件夾所在的路徑,我這里的bin所在的路徑是D:\mongodb\bin
回到桌面,右擊此電腦,點擊屬性,進入如下界面
再點擊 “高級系統設置”,進入如下界面
點擊 右下角的 ”環境變量“,進去后,
找到 “系統變量”中的path,并點擊path;
進去path編輯模式后,選擇右上角的新建
把bin文件夾的路徑,粘貼進去
1. 管理員模式打開命令行窗口
開頭聲明一下,我的mongodb是安裝在D盤中的(D:\mongodb)這個路徑,下面命令行中的命令,我是針對我的安裝路徑進行配置的,其他安裝路徑的,記得在輸入命令之前切換一下路徑就行了。
2. 創建目錄,執行下面的語句來創建數據庫和日志文件的目錄.
(記得切換到自己安裝的盤再輸命令,我的安裝在D盤,d: 可以切換到D盤。)
mkdir d:\data\db
mkdir d:\data\log
3. 創建配置文件
3.1 創建一個配置文件位于 D:\mongodb\mongod.cfg,進入到D:\mongodb\這個路徑后,輸入如下命令創建mongod.cfg文件。
type nul>mongod.cfg
3.2 指定 systemLog.path 和 storage.dbPath。具體配置內容如下。
systemLog: destination: file
path: d:\data\log\mongod.log
storage: dbPath: d:\data\db
注:win命令行沒有vim編輯器,我們可以在文件夾中找到我們的mongod.cfg這個文件,通過vs code打開,把配置內容粘貼進去,并保存。
通過執行mongod.exe,使用--install選項來安裝服務,使用--config選項來指定之前創建的配置文件。
d:\mongodb\bin\mongod.exe --config "d:\mongodb\mongod.cfg" --install
做到這里,我們就配置好了MongoDB。
net start MongoDB
net stop MongoDB