首頁>技術>

介紹

介紹

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_64GCC: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 /packagescd /packages
安裝MongoDB 4.2

官網下載

從官網下載

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/profileexport MONGODB_HOME=/tongfu.net/env/mongodb-4.2.2export 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/confmkdir /tongfu.net/env/mongodb-4.2.2/datamkdir /tongfu.net/env/mongodb-4.2.2/logs

建立配置檔案

[root@tfdev env]# vi /tongfu.net/env/mongodb-4.2.2/conf/mongodb.confdbpath = /tongfu.net/env/mongodb-4.2.2/data/logpath = /tongfu.net/env/mongodb-4.2.2/logs/mongodb.logbind_ip = 0.0.0.0wiredTigerCacheSizeGB = 2auth = truejournal = true

設定許可權

chown mongo.mongo -R /tongfu.net/env/mongodb-4.2.2/

自動啟動

新增自動啟動指令碼

[root@tfdev env]# cat > /lib/systemd/system/mongod.service <<EOF[Unit]Description=mongodAfter=network.target [Service]Type=forkingUser=mongoGroup=mongoExecStart=/tongfu.net/env/mongodb-4.2.2/bin/mongod -f /tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf --forkExecStop=/tongfu.net/env/mongodb-4.2.2/bin/mongod -f /tongfu.net/env/mongodb-4.2.2/conf/mongodb.conf --shutdownPrivateTmp=true [Install]WantedBy=multi-user.targetEOF

執行自動啟動

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

總結

mongodb的資料庫其實就是一個根資料夾mongodb的資料表就是根資料夾下的子資料夾mongodb的資料行就是子資料夾下的一個檔案,多行資料就是多個檔案mongodb的資料沒有欄位概念,就是一個大JSON資料結構,也就是一個字串mongodb提供了很多方法去查詢這些資料資料匯出/匯入

匯出資料

透過下面的命令匯出整個資料庫

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
MongoDB使用者管理

建立使用者

使用無認證模式啟動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資料庫

db.dropUser('test')

檢視使用者列表

1、登入到admin資料庫

2、選擇admin資料庫

use admin

3、檢視使用者列表

db.system.users.find()

總結

建立、修改、刪除使用者必須有許可權使用者可以刪除自己!!!調整哪個庫的使用者表要先選擇哪個庫檢視使用者列表必須到admin庫下操作建議弄一個root超級使用者,然後給每個庫一個獨立賬號

使用者角色

Read:允許使用者讀取指定資料庫readWrite:允許使用者讀寫指定資料庫dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profileuserAdmin:允許使用者向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,解決了~~

TFAPI操作MongoDB的方法

示例

// 引入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+$ifor($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");
TFAPI操作MongoDB的方法(新)

概念

新版本的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+$ifor($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");
MongoDB查詢技巧

第一批

// 特殊查詢語句示例// 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

22
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 第2天|16天搞定Vue3.0,Vue3.0的核心(必學)