mongodb3.2以上版本的學習心得(附與3.0之前的區別)
1.mongodb的安裝(忽略):官網很多版本自己去選擇要安裝的版本安裝,這裡就不做詳細的描述了,我安裝的是
mongodb-win32-x86_64-2008plus-ssl-3.2.9-signed.msi
2.設定存放資料的檔案目錄:
例如在D盤建立一個mongo_data資料夾
3.啟動:
開啟cmd命令列,輸入並指明資料的儲存路徑:mongod--dbpath=D:\mongo_data (localhost【主機地址】:27017【指定埠,如不寫,就預設27017】) (--auth【開放安全檢查,如果不寫,那麼任何使用者都可以訪問資料庫】)
4.操作命令
5.索引1.建立資料庫,使用命令 use 資料庫名稱 ,如: use mydb1 2.刪除當前資料庫,使用命令 db.dropDatabase() (在哪個資料庫下面就刪除哪個) 3.檢視所有資料庫,使用命令 show dbs 4.檢視當前所在資料庫,使用命令 db 5.檢視當前資料庫中所有的集合,使用命令 show collections 或使用show tables 6.建立集合有兩種方式,顯示建立和隱式建立 6.1 顯示建立可以使用命令 db.createCollection(“集合名稱") 6.2 隱式建立可以使用命令 db.集合名稱.insert({}),指建立集合並同時向集合中插入資料,例如: db.customer.insert({name:”jack”}) 7.向集合新增文件,使用命令 db.集合名稱.insert({}),例如: db.user1.insert({name:”jack”,age:20}) 8.向集合新增文件,使用命令 db.集合名稱.insert({}),例如:db.user1.insert({name:”jack”,age:20}) 說明:在mongodb中可以使用js指令碼,例如: for(var i=1;i<=10000;i++){ db.c1.insert({name:"dsadasd",age:i}) } 這樣就可以用指令碼直接插入10000條資料,只需要一秒。這個用mysql那些關係型資料庫基本上是不可能的。 9.刪除集合中的文件,使用命令 db.集合名稱.remove({刪除條件}),不加刪除條件為刪除集合中的所有文件,例如, db.c1.remove() 為刪除c1集合中的所有文件,db.c1.remove({name:”user1”})為刪除c1集合中name為user1的 文件 10.查詢集合中的文件,可以使用命令 db.集合名稱.find({條件}),或者使用 db.集合名稱.findOne()查詢第一個文 檔 11.查詢集合中的文件,返回某些特定的鍵值 <img src="https://img-blog.csdn.net/20160926131523792?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 12.查詢集合中的文件 ,使用條件表示式(<, <=, >, >=,!=) <img src="https://img-blog.csdn.net/20160926131607811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 13.查詢集合中的文件 ,統計(count)、排序(sort)、分頁(skip、limit) db.customer.count();//統計customer表中的資料總數 db.customer.find().count();//統計customer表中的資料總數和上一個一樣 db.customer.find({age:{$lt:5}}).count();//統計customer表中 age<5 的資料總數 db.customer.find().sort({age:1}); 降序-1//將customer表中的資料按照age欄位的升序排列 db.customer.find().skip(2).limit(3);//從2【0開始】開始的後面3條記錄 db.customer.find().sort({age:-1}).skip(2).limit(3);//age降序排列,從2開始的後面3條資料 db.customer.find().sort({age:-1}).skip(2).limit(3).count();//沒有意義【測試中統計的customer表中資料的總 數】 db.customer.find().sort({age:-1}).skip(2).limit(3).count(0);//沒有意義【測試中統計的customer表中資料的 總數】 db.customer.find().sort({age:-1}).skip(2).limit(3).count(1);//沒有意義【測試中統計的就是age降序排列,從 2開始後面3條資料的個數,已經限制了是3條了,所以結果也是3,因此,博主認為這個查詢沒有意義】 14.查詢集合中的文件 ,$all主要用來查詢陣列中的包含關係,查詢條件中只要有一個不包含就不返回 <img src="https://img-blog.csdn.net/20160926133244894?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 15.查詢集合中的文件 ,$in,類似於關係型資料庫中的IN <img src="https://img-blog.csdn.net/20160926133319067?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 16.查詢集合中的文件 ,$nin,與$in相反 <img src="https://img-blog.csdn.net/20160926133352224?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 17.查詢集合中的文件 ,$or,相當於關係型資料庫中的OR,表示或者的關係,例如查詢name為user2或者age為3的文件,命令為: db.customer.find({$or:[{name:”user2”},{age:3}]}) <img src="https://img-blog.csdn.net/20160926133423538?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 18.查詢集合中的文件 ,$nor,表示根據條件過濾掉某些資料,例如查詢name不是user2,age不是3的文件,命令為: db.customer.find({$nor:[{name:”user2”},{age:3}]}) <img src="https://img-blog.csdn.net/20160926133456789?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 19.查詢集合中的文件 ,$exists,用於查詢集合中存在某個鍵的文件或不存在某個鍵的文件,例如查詢customer集合中存在name鍵的所有文件,可以使用 db.customer.find({name:{$exists:1}}), $exists:1表示真,指存在 $exists:0表示假,指不存在 <img src="https://img-blog.csdn.net/20160926133529054?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 20.查詢集合中的文件 ,類似於關係型資料庫,mongodb中也有遊標的概念 <img src="https://img-blog.csdn.net/20160926133642572?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 21.更新集合中的文件,語法如下: db.collection.update(criteria,objNew,upsert,multi) 引數說明: criteria:用於設定查詢條件的物件 objNew:用於設定更新內容的物件 upsert:如果記錄已經存在,更新它,否則新增一個記錄,取值為0或1 multi:如果有多個符合條件的記錄,是否全部更新,取值為0或1 注意:預設情況下,只會更新第一個符合條件的記錄 一般情況下後兩個引數分別為0,1 ,即: db.collection.update(criteria,objNew,0,1) 22.更新集合中的文件,將集合中name為user1的文件改成name為jack <img src="https://img-blog.csdn.net/20160926133800714?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 23.更新集合中的文件, $set 用來指定一個鍵的值,如果這個鍵不存在,則建立它。例如: 給name為user1的文件新增address,可以使用命令:db.c1.update({name:”user1”},{$set:{address:”bj”}},0,1) 將name為user1的文件修改address為tj,其它鍵值對不變,命令為: db.c1.update({name:”user1”},{$set:{address:”tj”}},0,1) 24.更新集合中的文件,使用 $inc 將集合中name為user1的age加1,其它鍵不變, $inc表示使某個鍵值加減指定的數值 <img src="https://img-blog.csdn.net/20160926133849384?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 25.更新集合中的文件, $unset 用來刪除某個鍵,例如刪除name為user1的文件中的address鍵,可以使用命令: db.c1.update({name:”user1”},{$unset:{address:1}},0,1)
索引就是用來加速查詢的。資料庫索引與書籍的索引類似:有了索引就不需要翻遍整本書,資料庫則可以直接在索引中查詢,使得查詢速度能提高几個數量級。在索引中找到條目以後,就可以直接跳轉到目標文件的位置。
5.1建立普通索引,使用命令 db.collection.ensureIndex({key:1})
檢視關於索引的相關資訊,使用命令 db.collection.stats()
檢視查詢使用索引的情況,使用命令 db.collection.find({key:value}).explain()
刪除索引,使用命令 db.collection.dropIndex({key:1})
刪除集合,也會將集合中的索引全部刪除
5.2建立唯一索引,使用命令 db.collection.ensureIndex({key:1},{unique:true})
檢視關於索引的相關資訊,使用命令 db.collection.stats()
檢視查詢使用索引的情況,使用命令 db.collection.find({key:value}).explain()
刪除索引,使用命令 db.collection.dropIndex({key:1})
刪除集合,也會將集合中的索引全部刪除
6.固定集合
固定集合指的是事先建立而且大小固定的集合 。
固定集合特性:固定集合很像環形佇列,如果空間不足,最早的文件就會被刪除,為新的文件騰出空間。一般來 說,固定集合適用於任何想要自動淘汰過期屬性的場景,沒有太多的操作限制。
建立固定集合使用命令:db.createCollection(“collectionName”,{capped:true,size:100000,max:100});
size指定集合大小,單位為KB,max指定文件的數量
當指定文件數量上限時,必須同時指定大小。淘汰機制只有在容量還沒有滿時才會依據文件數量來工作。要是容量 滿了,淘汰機制會依據容量來工作。
7.備份和恢復
7.1備份
MongoDB提供了備份和恢復的功能,分別是MongoDB下載目錄下的mongodump.exe和mongorestore.exe檔案
備份資料使用下面的命令:
mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017
-d:需要備份的資料庫例項,例如:test
-o:備份的資料存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄 下建立一個test目錄,這個目錄裡面存放該資料庫例項的備份資料。
7.2恢復
恢復資料使用下面的命令:
mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:MongoDB所在伺服器地址
-d:需要恢復的資料庫例項,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
-directoryperdb:備份資料所在位置,例如:c:\data\dump\test
8.匯入和匯出
8.1匯出
匯出資料可以使用命令:
mongoexport -h dbhost -d dbname -c collectionName -o output
引數說明:
-h 資料庫地址
-d 指明使用的庫
-c 指明要匯出的集合
-o 指明要匯出的檔名
8.2匯入
匯入資料可以使用命令:
mongoimport -h dbhost -d dbname -c collectionname 檔案的地址...
引數說明:
-h 資料庫地址
-d 指明使用的庫
-c 指明要匯入的集合
9.安全認證
每個MongoDB例項中的資料庫都可以有許多使用者。如果開啟了安全性檢查,則只有資料庫認證使用者才能執行讀或者 寫操作。
在認證的上下文中,MongoDB會將普通的資料作為admin資料庫處理。admin資料庫中的使用者被視為超級使用者(即管理員)。
在認證之後,管理員可以讀寫所有資料庫,執行特定的管理命令,如listDatabases和shutdown。
在開啟安全檢查之前,一定要至少有一個管理員賬號。
9.1在3.0之前,寫法如下:
<span style="font-size:18px;"> 在admin資料庫中建立管理員賬號:
use admin;
db.addUser(“root”,”root”);
在test資料庫中建立普通賬號:
use test;
db.addUser(“zhangsan”,”123”);
db.addUser(“lisi”,”123”,true);
注意:使用者zhangsan,密碼為123,對test資料庫擁有讀寫許可權
使用者lisi,密碼為123,對test資料庫擁有隻讀許可權
重新啟動資料庫服務,並開啟安全檢查:
mongod --dbpath d:\mongo_data --auth</span>
9.2在3.0之後,寫法如下:
<span style="font-size:18px;"> //建立超級管理員賬號
use admin
db.createUser(
{
user: "root",
pwd: "root",
roles: [ { role: "root"} ]
}
//建立管理員賬號
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}</span>
//建立資料庫的管理員,以test為例
<span style="font-size:18px;"> db.createUser(
{
user: "ttt",
pwd: "ttt",
roles: [ { role: "readWrite", db: "test" } ]
}
//檢視剛剛建立的使用者:
show users 或者 db.system.users.find()
說明:如果admin和root也想操作test,直接登入到test是不行的。需要先進入到admin然後再轉到test才可以
引數role:</span>
root 這是超級管理員
readWrite 有讀寫許可權
read 有讀許可權
userAdminAnyDatabase 這個角色擁有分配角色和使用者的許可權,但沒有查寫的缺陷
官網文件連結:https://docs.mongodb.com/manual/tutorial/enable-authentication/
10.主從複製(主從叢集)
主從複製是MongoDB最常用的複製方式。這種方式非常靈活,可用於備份、故障恢復、讀擴充套件等。最基本的設定方式就是建立一個主節點和一個或者多個從節點,每個從節點要知道主節點的地址。執行mongod --master就啟動了主伺服器。執行mongod --slave --source master_address 則啟動了從伺服器,其中master_address就是上面主節點的地址。
為了方便演示,可以在一臺計算機上來模擬主節點和從節點。在D盤建立兩個目錄master和slave,master目錄作為主節點的資料檔案的目錄,slave目錄作為從節點的資料檔案的目錄。注意:主節點和從節點要指定不同的埠。啟動主節點:mongod --dbpath d:\master --port 10000 --master啟動從節點:mongod --dbpath d:\slave --port 10001 --slave --source localhost:10000啟動成功後就可以連線主節點進行操作了,而這些操作會同步到從節點。
11.副本集
副本集就是有自動故障恢復功能的主從叢集。主從叢集和副本集最大的區別就是副本集沒有固定的“主節點”;整個叢集會選出一個“主節點”,當其掛掉後,又在剩下的從節點中選中其他節點為“主節點”,副本集總有一個活躍點(primary)和一個或多個備份節點(secondary)。
以三個節點為例:節點1:HOST:localhost:10001Log File:D:\mongodb\logs\node1\logs.txtData File:D:\mongodb\dbs\node1節點2:HOST:localhost:10002Log File:D:\mongodb\logs\node2\logs.txtData File:D:\mongodb\dbs\node2節點3:HOST:localhost:10003Log File:D:\mongodb\logs\node3\logs.txtData File:D:\mongodb\dbs\node3
11.1 3.0之前的寫法
<span style="font-size:18px;">啟動節點1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath D:\mongodb\logs\node1\logs.txt --logappend --port
10001 --replSet gaoshili/localhost:10002(--master)省略,如果加了這個會報錯
啟動節點2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath D:\mongodb\logs\node2\logs.txt --logappend --port
10002 --replSet gaoshili/localhost:10001
啟動節點3:
mongod --dbpath D:\mongodb\dbs\node3 --logpath D:\mongodb\logs\node3\logs.txt --logappend --port
10003 --replSet gaoshili/localhost:10001,localhost:10002</span>
11.2 3.0之後的寫法<span style="font-size:18px;"> 啟動節點1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath D:\mongodb\logs\node1\logs.txt --logappend --port
10001 --replSet gaoshili/localhost:10002 (--master)省略,如果加了這個會報錯
啟動節點2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath D:\mongodb\logs\node2\logs.txt --logappend --port
10002 --replSet gaoshili/localhost:10001
啟動節點3:
mongod --dbpath D:\mongodb\dbs\node3 --logpath D:\mongodb\logs\node3\logs.txt --logappend --port
10003 --replSet gaoshili/localhost:10001,localhost:10002</span>
//初始化節點都相同,如下
db.runCommand(
{"replSetInitiate":
{"_id":"gaoshili","members":[
{"_id":1,"host":"localhost:10001","priority":3},
{"_id":2,"host":"localhost:10002","priority":2},
{"_id":3,"host":"localhost:10003","priority":1}
]
}
});
<span style="font-size:18px;"> //查詢當前主庫,登入10001
mongo localhost:10001
db.$cmd.findOne ( {ismaster: 1 } );
<img src="https://img-blog.csdn.net/20160926153046758?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</span>
<span style="font-size:18px;"> //查詢當前主庫,登入10002
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );
<img src="https://img-blog.csdn.net/20160926153108883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</span>
然後可以在主庫10001種,新增資料,在兩個備庫檢視是否同步。
//關閉10001服務Dos命令視窗, 登入10002查詢當前主庫
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );
由此可以看出,10001關閉,之後10002自動成為主庫,說明副本集配置成功。