MongoDB的安裝與使用

  MongoDB是一款NoSql數據庫。NoSql數據庫叫非關係型數據庫,NoSql的全名Not only sql。是爲了解決高併發、高可用、高可擴展,以及大數據存儲等一系列問題而產生的數據庫解決方案。NoSql,它不能替代關係型數據庫,只能作爲關係型數據庫的一個良好補充。

  NoSql數據庫又分爲多種,如鍵值(Key-Value)存儲數據庫(如redis),列存儲數據庫(如HBase),文檔型數據庫(如MongoDB),圖形(Graph)數據庫等。

  MongoDB作爲文檔型數據庫,其典型應用是Web應用(與Key-Value類似,Value是結構化的),它的數據模型是 一系列鍵值對。MongoDB的優勢是數據結構要求不嚴格,操作靈活;劣勢是查詢性能不高,而且缺乏統一的查詢語法。

  當前,我們以win7系統爲例,64位win7安裝MongoDB相對簡單,因爲MongoDB官網在community server版本(https://www.mongodb.com/download-center#community)中僅推薦了一款64位的MongoDB,在安裝方面,網上也提供了不少帖子,相信大家都能順利安裝好。

 

  相比較而言,32位的win7系統在安裝MongoDB時就要繁瑣很多。那麼,對於使用32位win7系統的朋友而言,應該如何安裝MongoDB,以及使用呢?

  第一步:

  首先,在這個網址中https://www.mongodb.org/dl/win32/i386下載後綴爲msi的MongoDB,此處以v3.2.19版本爲例。

  下載了MongoDB後,雙擊運行即可進入安裝;在安裝過程中,可以選擇程序安裝路徑。在此,我將程序安裝路徑改爲E:\mongodb2。

  MongoDB安裝好後,在E:\mongodb2下會生成一個bin目錄,bin目錄是可執行文件目錄,啓動mongo的服務器端以及客戶端都在這裏;同時,我們還要在E:\mongodb2下新建三個目錄:conf爲配置文件存放目錄;data爲數據存放目錄;log爲日誌存放目錄。如下所示:

  接着,在conf下創建一個名稱爲mongod.conf的配置文件,裏面內容如下:

port=6699
dbpath=E:\mongodb2\data
logpath=E:\mongodb2\log\mongod.log 

   配置文件裏配置了MongoDB服務開啓後的端口,數據文件目錄,日誌存放目錄。爲mongod.conf的常見基本配置參數釋義(本文簡單演示,僅配置上面三項即可):

#數據庫數據存放目錄
dbpath=../data
#數據庫日誌存放目錄
logpath=../logs/mongod.log 
#以追加的方式記錄日誌
logappend = true
#端口號 默認爲27017
port=6699
#以後臺方式運行進程
fork=true 
#開啓用戶認證
auth=true
#關閉http接口,默認關閉http端口訪問
nohttpinterface=true
#mongodb所綁定的ip地址
bind_ip = 127.0.0.1 
#啓用日誌文件,默認啓用
journal=true 
#這個選項可以過濾掉一些無用的日誌信息,若需要調試使用請設置爲false
quiet=true  

  同時,在log目錄下創建名稱爲mongod.log的文件,裏面內容可以爲空,在MongoDB服務啓動後,這個日誌文件裏會記錄服務運行情況。

  第二步:

  接下來,將MongoDB安裝爲Windows服務,這步很關鍵。先是切換到bin目錄下,然後打開DOS窗口,執行如下命令:

E:\mongodb2\bin>mongod --dbpath "E:\mongodb2\data" --logpath "E:\mongodb2\log\mongod.log" --install --serviceName "MongoDB"  --journal

   這時,查看win7計算機管理的服務列表,可以看到名稱爲MongoDB的Windows服務已經在裏面。

  第三步:

  我們可以Windows的服務列表窗口裏開啓MongoDB服務,也可以在DOS窗口裏啓動MongoDB服務:

net start MongoDB

   這時,計算機的服務列表裏顯示MongoDB服務已經開啓。我們還可以點擊MongoDB的啓動類型,將其設置爲手動。如下所示:

  其實,我們在進行完“第二步”後,不必再進行第三步(第三步主要是爲了演示Windows服務的啓動,此處可以忽略),直接通過一個批處理文件配置MongoDB的端口(如果MongoDB沒有安裝在本地,需要在配置文件mongod.conf里加上"bind_id=ip地址")等信息,然後啓動MongoDB服務;接着,再通過一個批處理文件啓動操作MongoDB的客戶端即可。這就是我們下面要講述的內容。

  爲了以後啓動MongoDB服務,以及使用MongoDB服務更方便,我們還可以製作兩個批處理文件。一個名稱爲“啓動MongoDB服務端.bat”,內容如下:

E:
cd E:\mongodb2\bin
mongod -f E:\mongodb2\conf\mongod.conf --journal
pause

   另一個是啓動MongoDB客戶端,從而操作MongoDB。這個批處理文件名稱爲“啓動MongoDB客戶端.bat”,內容如下:

E:
cd E:\mongodb2\bin
mongo 127.0.0.1:6699/test
pause

   接着,雙擊“啓動MongoDB服務端.bat文件,啓動成功後顯示如下:

 

  這時,在瀏覽器地址欄裏輸入http://localhost:6699,顯示如下:

   這說明MongoDB服務已經設置和開啓成功。接下來,啓動MongoDB客戶端,操作MongoDB。

  雙擊“啓動MongoDB客戶端.bat”批處理文件,顯示如下:

  說明MongoDB客戶端啓動成功。

  到此,MongoDB安裝完畢,客戶端也啓動完畢,我們接下來操作MongoDB。

  MongoDB有這些基本操作命令,我們瞭解下:

 (1)查詢數據庫結構: 
#查看現有數據庫
> show dbs    
local  0.078GB
#使用某個數據庫;沒有就創建並使用
> use yc
switched to db yc
#插入數據
> db.yc.insert({"_id":1001,"name":"lzy","sex":"男"})
WriteResult({ "nInserted" : 1 })
#插入指定數據庫下的所有數據
> db.yc.find()
{ "_id" : 1001, "name" : "lzy", "sex" : "男" }
#更新數據
> db.yc.update({"_id":1001},{"name":"nlz","sex":"女"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.yc.find()
{ "_id" : 1001, "name" : "nlz", "sex" : "女" }
#刪除數據
> db.yc.remove({"_id":1001})
WriteResult({ "nRemoved" : 1 })
> db.yc.find()
#創建數據集合
> db.createCollection("colA",{autoIndexId:true})
{
        "note" : "the autoIndexId option is deprecated and will be removed i
        "ok" : 1
}
> db.colA.insert({"_id":1001,"name":"張三"})
WriteResult({ "nInserted" : 1 })
> for(i=1;i<=10;i++) db.colA.insert(data:i)
2018-04-29T00:53:17.887+0800 E QUERY    [thread1] SyntaxError: missing ) aft
#批量插入數據
> for(i=1;i<=10;i++) db.colA.insert({data:i})
WriteResult({ "nInserted" : 1 })
> db.colA.find()
{ "_id" : 1001, "name" : "張三" }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80a"), "data" : 1 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80b"), "data" : 2 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80c"), "data" : 3 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80d"), "data" : 4 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80e"), "data" : 5 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c80f"), "data" : 6 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c810"), "data" : 7 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c811"), "data" : 8 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c812"), "data" : 9 }
{ "_id" : ObjectId("5ae4a71301b5efddc588c813"), "data" : 10 }
#修改數據集合裏某個數據的值
> db.colA.update({"name":"張三"},{"name":"李四"})

   上面是MongoDB的一些基本操作指令。通過上述操作,我們可以觀察出一個特點,那就是:MongoDB存儲數據是以json格式進行的(如:({"key":"value,..."}))。

  接下來,我們再看在Java程序中如何操作MongoDB。

  我們以idea這款IDE工具爲例,創建一個工程,然後在工程裏添加MongoDB與單元測試的依賴(這是因爲我們要用單元測試展開測試),如下圖:

   接下來,測試連接MongoDB服務(TestConnection2.java):

package com.itszt;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import org.junit.Test;

/**
 * 測試連接MongoDB
 */
public class TestConnection2 {
    @Test
    public void testConnMongo(){
        //連接到MongoDB服務
        MongoClient mongoClient=new MongoClient("127.0.0.1",6699);
        //連接到MongoDB數據庫
        MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
        System.out.println("mongoDatabase = " + mongoDatabase);
        System.out.println("MongoDB connect successfully");
        //關閉MongoDB服務
        mongoClient.close();
    }
}

   控制檯打印如下(顯示正常):

mongoDatabase = com.mongodb.MongoDatabaseImpl@150efb8
MongoDB connect successfully

   接下來,我們再通過java程序操作MongoDB(TestCURD2.java):

  

package com.itszt;

import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.CreateCollectionOptions;
import org.bson.Document;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.regex.Pattern;

/**
 * 測試MongoDB的數據操作
 */
public class TestCURD2 {
    private MongoClient mongoClient;
    private MongoDatabase mongoDatabase;

    @Before
    public void init() {
        mongoClient = new MongoClient("127.0.0.1", 6699);
        mongoDatabase = mongoClient.getDatabase("test");
        System.out.println("MongoDB connect successfully");
    }

    @After
    public void close() {
        mongoClient.close();
    }

    @Test
    public void testCollection() {
        CreateCollectionOptions collectionOptions = new CreateCollectionOptions();
        collectionOptions.autoIndex(true);
        /*
            capped爲true,表示起用封閉的集合,集合容量有固定上限,
            集合超過上限時會自動覆蓋其最舊的目錄
            如果capped爲true,則必須指定size參數
            sizeInBytes()表示集合字節大小
         */
        /*collectionOptions.capped(true);
        collectionOptions.sizeInBytes(1024*1024*100);*/

        //設置集合中文檔個數的上限
        collectionOptions.maxDocuments(1000);
        mongoDatabase.createCollection("colD", collectionOptions);
        MongoCollection<Document> colD = mongoDatabase.getCollection("colD");
        System.out.println("colD = " + colD);
    }

    //測試對於數據集合的添加
    @Test
    public void testInsert() {
        MongoCollection<Document> colD = mongoDatabase.getCollection("colD");

        ArrayList<Document> documents = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Document document = new Document();
            document.append("userName", "張三-" + i);
            document.append("userPwd", "admin_" + i);
            documents.add(document);
        }
        //批量插入數據
        colD.insertMany(documents);

        //如果插入單條數據,則是:
        //colD.insertOne(Docoment document);
    }

    //測試查詢數據集合
    @Test
    public void testFind(){
        MongoCollection<Document> colD = mongoDatabase.getCollection("colD");

        //正則條件
        BasicDBObject basicDBObjectReg = new BasicDBObject();
        Pattern pattern = Pattern.compile(".*[0]");
        basicDBObjectReg.put("$regex",pattern);
        //條件約束
        BasicDBObject basicDBObject = new BasicDBObject();
        basicDBObject.append("userName",basicDBObjectReg);

        FindIterable<Document> documents = colD.find(basicDBObject);
        MongoCursor<Document> iterator = documents.iterator();
        Document document =null;
        while (iterator.hasNext()){
            document = iterator.next();
            //取得整個數據
            System.out.println("document = " + document);
            //取得若干字段值
            System.out.println(document.get("userName")+"-->"+document.get("userPwd"));
        }
    }

    //測試對於數據集合的修改
    @Test
    public void testUpdate(){
        MongoCollection<Document> colD = mongoDatabase.getCollection("colD");

        BasicDBObject basicDBObjectOld = new BasicDBObject();
        basicDBObjectOld.put("userName","李四");

        BasicDBObject basicDBObjectNew = new BasicDBObject();
        basicDBObjectNew.put("userName","王五");

        BasicDBObject update = new BasicDBObject("$set", basicDBObjectNew);
        colD.updateOne(basicDBObjectOld,update);

        //批量修改
        //colD.updateMany(basicDBObjectOld,update);
    }

    //測試對於數據集合的刪除
    @Test
    public void testDelete(){
        MongoCollection<Document> colD = mongoDatabase.getCollection("colD");

        //正則條件
        BasicDBObject basicDBObjectReg = new BasicDBObject();
        Pattern pattern = Pattern.compile("王.*");
        basicDBObjectReg.put("$regex",pattern);
        //條件約束
        BasicDBObject basicDBObject = new BasicDBObject();
        basicDBObject.append("userName",basicDBObjectReg);

        colD.deleteOne(basicDBObject);

        //批量刪除
//        colD.deleteMany(basicDBObject);
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章