4.1MongoDb介紹及java使用

什么是mongogb

MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案萨咳。

MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的决记。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式倍踪,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型系宫。Mongo最大的特點是他支持的查詢語言非常強(qiáng)大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言建车,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能扩借,而且還支持對數(shù)據(jù)建立索引。
來源 【百度百科

mongodb的特性與優(yōu)點

  • 存儲方式:虛擬內(nèi)存+持久化缤至。
  • 查詢語句:是獨特的Mongodb的查詢方式潮罪。
  • 適合場景:事件的記錄,內(nèi)容管理或者博客平臺等等领斥。
  • 架構(gòu)特點:可以通過副本集嫉到,以及分片來實現(xiàn)高可用。
  • 數(shù)據(jù)處理:數(shù)據(jù)是存儲在硬盤上的月洛,只不過需要經(jīng)常讀取的數(shù)據(jù)會被加載到內(nèi)存中何恶,將數(shù)據(jù)存儲在物理內(nèi)存中,從而達(dá)到高速讀寫嚼黔。
  • 成熟度與廣泛度:新興數(shù)據(jù)庫细层,成熟度較低惜辑,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫,比較完善的DB之一疫赎,適用人群不斷在增長盛撑。

優(yōu)點:

  • 快速!在適量級的內(nèi)存的Mongodb的性能是非常迅速的捧搞,它將熱數(shù)據(jù)存儲在物理內(nèi)存中抵卫,使得熱數(shù)據(jù)的讀寫變得十分快。
  • 高擴(kuò)展
  • 自身的Failover機(jī)制
  • json的存儲格式

mongodb的具體應(yīng)用場景

mongodb的主要目標(biāo)是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統(tǒng)的RDBMS系統(tǒng)(豐富的功能)架起一座橋梁胎撇,集兩者的優(yōu)勢于一身陌僵。mongo適用于以下場景:

  • 1、網(wǎng)站數(shù)據(jù):mongo非常適合實時的插入创坞,更新與查詢碗短,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復(fù)制及高度伸縮性。
  • 2题涨、緩存:由于性能很高偎谁,mongo也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后纲堵,由mongo搭建的持久化緩存可以避免下層的數(shù)據(jù)源過載巡雨。
  • 3、大尺寸席函、低價值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較貴铐望,在此之前,很多程序員往往會選擇傳統(tǒng)的文件進(jìn)行存儲茂附。
  • 4正蛙、高伸縮性的場景:mongo非常適合由數(shù)十或者數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫。
  • 5营曼、用于對象及JSON數(shù)據(jù)的存儲:mongo的BSON數(shù)據(jù)格式非常適合文檔格式化的存儲及查詢乒验。
    不適合的場景:
  • 1、高度事務(wù)性的系統(tǒng)蒂阱,比如銀行锻全、證券等強(qiáng)業(yè)務(wù)系統(tǒng)。
  • 2录煤、傳統(tǒng)的商業(yè)智能應(yīng)用鳄厌,比如BI查詢分析,需要對多字段進(jìn)行組合查詢妈踊。
  • 3了嚎、需要SQL的場景,比如需要做sum响委、groupby 等匯總統(tǒng)計系統(tǒng)新思。

上面那些來源于mongodb的官方說明,簡單來講赘风,就是需要快速夹囚、大量按唯一主鍵進(jìn)行查詢更新的,可以采用mongodb邀窃,需要多表關(guān)聯(lián)查詢荸哟、事務(wù)操作的,不適合mongodb

舉幾個例子:
1瞬捕、ofo或膜拜單車等車輛的位置信息鞍历,數(shù)量有限(相對),而且可以根據(jù)車牌號進(jìn)行快速查詢肪虎,并需要實時更新位置信息劣砍,即LBS應(yīng)用。
2扇救、社交場景刑枝,使用 MongoDB 存儲存儲用戶信息,以及用戶發(fā)表的朋友圈信息迅腔,通過地理位置索引實現(xiàn)附近的人装畅、地點等功能。
3沧烈、鐵路的車號追蹤系統(tǒng)掠兄,實時查詢每輛車的車種、車型锌雀、貨物蚂夕、當(dāng)前站、當(dāng)前位置等信息腋逆。
4双抽、實時監(jiān)控系統(tǒng),監(jiān)控服務(wù)器的訪問數(shù)據(jù)闲礼、監(jiān)控應(yīng)用系統(tǒng)的請求計數(shù)等
5牍汹、網(wǎng)游中的玩家裝備、積分柬泽、技能慎菲、經(jīng)驗等快速變換信息,方便查詢锨并、更新
6露该、物流場景,使用 MongoDB 存儲訂單信息第煮,訂單狀態(tài)在運送過程中會不斷更新解幼,以 MongoDB 內(nèi)嵌數(shù)組的形式來存儲抑党,一次查詢就能將訂單所有的變更讀取出來
7、物聯(lián)網(wǎng)場景撵摆,使用 MongoDB 存儲所有接入的智能設(shè)備信息底靠,以及設(shè)備匯報的日志信息,并對這些信息進(jìn)行多維度的分析
8特铝、視頻直播暑中,使用 MongoDB 存儲用戶信息、禮物信息等

mongodb下載與安裝

官網(wǎng)下載

分linux鲫剿、windows鳄逾、mac等,根據(jù)需要選擇下載灵莲,生產(chǎn)還是建議linux雕凹,主從結(jié)構(gòu)。

linux下安裝:http://www.runoob.com/mongodb/mongodb-linux-install.html
windows下安裝:http://www.runoob.com/mongodb/mongodb-window-install.html

界面化管理工具

mongodb的管理工具很多政冻,這里介紹用的比較多的Robomongo

工具下載

安裝完后打開:

Robomongo工具

建立連接请琳,端口默認(rèn)27017

連接后如圖所示

mongodb在java中的使用

添加mongodb的依賴

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
     <version>3.4.2</version>
</dependency>
<dependency>
     <groupId>org.mongodb</groupId>
     <artifactId>bson</artifactId>
     <version>3.4.2</version>
</dependency>

這里面用到了兩個,一個是mongodb的java驅(qū)動赠幕,一個mongodb的bson數(shù)據(jù)格式j(luò)ar包

MongoConnect連接數(shù)據(jù)庫

public class MongoConnect {

    /**
     * 建立mongodb連接
     *
     * @return
     */
    public MongoClient getConnection() {
        MongoClient mongoClient = null;
        try {
            //連接到MongoDB服務(wù) 如果是遠(yuǎn)程連接可以替換“l(fā)ocalhost”為服務(wù)器所在IP地址
            //ServerAddress()兩個參數(shù)分別為 服務(wù)器地址 和 端口
            ServerAddress serverAddress = new ServerAddress("localhost", 27017);
           /* List<ServerAddress> addrs = new ArrayList<ServerAddress>();
            addrs.add(serverAddress);//如果是集群俄精,需要用到地址列表*/
            mongoClient = new MongoClient(serverAddress);
            /*
            //MongoCredential.createScramSha1Credential()三個參數(shù)分別為 用戶名 數(shù)據(jù)庫名稱 密碼
            MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();
            credentials.add(credential);

            //通過連接認(rèn)證獲取MongoDB連接
            mongoClient = new MongoClient(addrs, credentials);
            */
        } catch (Exception e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        }
        return mongoClient;
    }

    /**
     * 關(guān)閉連接
     *
     * @param mongoClient
     */
    public void closeConnection(MongoClient mongoClient) {
        mongoClient.close();
    }

    public static void main(String[] args) {
        MongoConnect mongoConnect = new MongoConnect();
        MongoClient mongoClient = mongoConnect.getConnection();
        System.out.println(mongoClient);
        mongoConnect.closeConnection(mongoClient);
    }
}

這里要說明以下幾點:
1、如果連接mongodb的集群榕堰,需要用到List<ServerAddress>竖慧,mongoClient連接多個地址
2、連接時如果mongodb沒有賬號和密碼逆屡,則不需要設(shè)置MongoCredential直接連接即可圾旨。當(dāng)然一定要確保mongodb處于內(nèi)網(wǎng),不被外網(wǎng)攻擊魏蔗。前一段時間出現(xiàn)的mongodb攻擊砍的,就是因為mongodb沒有密碼,同時27017端口開放了莺治,導(dǎo)致數(shù)據(jù)信息泄露廓鞠。

創(chuàng)建Collection和查詢,MongoConnect.java

public class CreateCollection {
    public static void main(String[] args) {
        MongoConnect mongoConnect = new MongoConnect();
        MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接

        MongoDatabase mongoDatabase = mongoClient.getDatabase("test");//連接指定數(shù)據(jù)庫test,如果不存在會創(chuàng)建
        System.out.println("連接數(shù)據(jù)庫成功");
        //創(chuàng)建集合 參數(shù)為 “集合名稱”
        mongoDatabase.createCollection("collectionTest");//創(chuàng)建集合
        System.out.println("集合創(chuàng)建成功");

        //獲取集合 參數(shù)為“集合名稱”
        MongoCollection<Document> mongoCollection = mongoDatabase.getCollection("collectionTest");//如果不存在會創(chuàng)建
        System.out.println("成功獲取集合");
    }
}

說明以下幾點:

1谣旁、mongoClient.getDatabase("test"); mongoClient在獲取數(shù)據(jù)庫時床佳,如果該庫不存在,會新建一個
2榄审、mongodb中的database和關(guān)系數(shù)據(jù)庫中的database非常相像砌们,MongoCollection和關(guān)系數(shù)據(jù)庫中的table類似。

插入文檔,InsertDocument.java

public class InsertDocument {

    public static void main(String[] args) {
        MongoConnect mongoConnect = new MongoConnect();
        MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
        MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
        Document document = new Document("title", "MongoDB").
                append("description", "database").
                append("likes", 100).
                append("by", "Fly");
        List<Document> documents = new ArrayList<Document>();
        documents.add(document);
        mongoCollection.insertMany(documents);
        System.out.println("文檔插入成功");
    }
}

這里面的Document就和關(guān)系數(shù)據(jù)庫中的row類似浪感,先建立一個Document昔头,并設(shè)置具體的字段,這里面的字段就是按照key影兽,value的形式創(chuàng)建的揭斧。然后獲取mongoCollection,執(zhí)行insert查詢數(shù)據(jù)赢笨。

執(zhí)行成功,用Robomongo查看如下:

查看新增記錄

這里面的id字段是mongodb自動生成的字段

檢索文檔驮吱,SearchDocument.java

public class SearchDocument {

    public static void main(String[] args) {
        MongoConnect mongoConnect = new MongoConnect();
        MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
        MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
        //檢索所有文檔
        /**
         * 1. 獲取迭代器FindIterable<Document>
         * 2. 獲取游標(biāo)MongoCursor<Document>
         * 3. 通過游標(biāo)遍歷檢索出的文檔集合
         * */
        FindIterable<Document> findIterable = mongoCollection.find();
        MongoCursor<Document> mongoCursor = findIterable.iterator();
        while(mongoCursor.hasNext()){
            System.out.println(mongoCursor.next());
        }
    }
}

原理就是茧妒,先確定mongoCollection即要檢索哪個Collection,然后建立FindIterable迭代器左冬,建立mongoCursor桐筏,就是JDBC中的ResultSet,循環(huán)輸出。

當(dāng)然Mongodb的查詢還有很多很多拇砰,比如聚合查詢梅忌、條件查詢、or查詢等等除破,后面會更加詳細(xì)的介紹

更新Document牧氮,UpdateDocument.java

public class UpdateDocument {
    public static void main(String[] args) {

        MongoConnect mongoConnect = new MongoConnect();
        MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
        MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建

        //更新文檔   將文檔中l(wèi)ikes=100的文檔修改為likes=200
        mongoCollection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200)));
        //檢索查看結(jié)果
        FindIterable<Document> findIterable = mongoCollection.find();
        MongoCursor<Document> mongoCursor = findIterable.iterator();
        while (mongoCursor.hasNext()) {
            System.out.println(mongoCursor.next());
        }
    }
}

mongoCollection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200)));這句話,先查找對應(yīng)記錄瑰枫,然后更新對應(yīng)字段踱葛。

刪除Document,DeleteDocument.java

public class DeleteDocument {
    public static void main(String[] args) {
        MongoConnect mongoConnect = new MongoConnect();
        MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
        MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
        //刪除符合條件的第一個文檔
        mongoCollection.deleteOne(Filters.eq("likes", 200));
        //刪除所有符合條件的文檔
        mongoCollection.deleteMany (Filters.eq("likes", 200));
        //檢索查看結(jié)果
        FindIterable<Document> findIterable = mongoCollection.find();
        MongoCursor<Document> mongoCursor = findIterable.iterator();
        while(mongoCursor.hasNext()){
            System.out.println(mongoCursor.next());
        }
    }
}

mongoCollection.deleteMany (Filters.eq("likes", 200));可以刪除一條或多條,按照指定條件操作光坝。

學(xué)習(xí)mongodb的時候尸诽,每個對象都參照關(guān)系數(shù)據(jù)庫的對應(yīng)對象,學(xué)習(xí)起來就會快很多了盯另。各個對象的關(guān)聯(lián)關(guān)系如下:

  • MongoConnect->Connection
  • MongoDatabase ->Database(MySql),User/Schema(Oracle)
  • Collection->Table
  • Document ->Row
  • FindIterable->PrepareStatement
  • FindIterable ->ResultSet

源碼下載

本工程詳細(xì)源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末性含,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸳惯,更是在濱河造成了極大的恐慌商蕴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芝发,死亡現(xiàn)場離奇詭異究恤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)后德,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門部宿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事理张『丈撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵雾叭,是天一觀的道長悟耘。 經(jīng)常有香客問我,道長织狐,這世上最難降的妖魔是什么暂幼? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮移迫,結(jié)果婚禮上旺嬉,老公的妹妹穿的比我還像新娘。我一直安慰自己厨埋,他們只是感情好邪媳,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荡陷,像睡著了一般雨效。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上废赞,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天徽龟,我揣著相機(jī)與錄音,去河邊找鬼唉地。 笑死顿肺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渣蜗。 我是一名探鬼主播屠尊,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耕拷!你這毒婦竟也來了讼昆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骚烧,失蹤者是張志新(化名)和其女友劉穎浸赫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赃绊,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡既峡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碧查。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运敢。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡校仑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出传惠,到底是詐尸還是另有隱情迄沫,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布卦方,位于F島的核電站羊瘩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盼砍。R本人自食惡果不足惜尘吗,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浇坐。 院中可真熱鬧睬捶,春花似錦、人聲如沸吗跋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跌宛。三九已至,卻和暖如春积仗,著一層夾襖步出監(jiān)牢的瞬間疆拘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工寂曹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留哎迄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓隆圆,卻偏偏與公主長得像漱挚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渺氧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容