1. 程式人生 > >mongodb3.2以上版本的學習心得(附與3.0之前的區別)

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.操作命令

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.索引

索引就是用來加速查詢的。資料庫索引與書籍的索引類似:有了索引就不需要翻遍整本書,資料庫則可以直接在索引中查詢,使得查詢速度能提高几個數量級。在索引中找到條目以後,就可以直接跳轉到目標文件的位置。

    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自動成為主庫,說明副本集配置成功。