Spring Boot 中使用 MongoDB 增刪改查

本文快速入門,MongoDB 結合SpringBoot starter-data-mongodb 進行增刪改查html

一、什麼是MongoDB ?

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。java

在高負載的狀況下,添加更多的節點,能夠保證服務器性能。mysql

MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。git

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。github

MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。spring

二、MongoDB 優缺點

優勢sql

  • 文檔結構的存儲方式,可以更便捷的獲取數據
  • 內置GridFS,支持大容量的存儲
  • 海量數據下,性能優越
  • 動態查詢
  • 全索引支持,擴展到內部對象和內嵌數組
  • 查詢記錄分析
  • 快速,就地更新
  • 高效存儲二進制大對象 (好比照片和視頻)
  • 複製(複製集)和支持自動故障恢復
  • 內置 Auto- Sharding 自動分片支持雲級擴展性,分片簡單
  • MapReduce 支持複雜聚合
  • 商業支持,培訓和諮詢

缺點mongodb

  • 不支持事務操做
  • MongoDB 佔用空間過大 (不過這個肯定對於目前快速下跌的硬盤價格來講,也不算什麼缺點了)
  • MongoDB沒有如MySQL那樣成熟的維護工具
  • 沒法進行關聯表查詢,不適用於關係多的數據
  • 複雜聚合操做經過mapreduce建立,速度慢
  • 模式自由,自由靈活的文件存儲格式帶來的數據錯
  • MongoDB 在你刪除記錄後不會在文件系統回收空間。除非你刪掉數據庫。可是空間沒有被浪費

三、優缺點詳細解釋

1.內置GridFS,支持大容量的存儲:數據庫

GridFS是一個出色的分佈式文件系統,能夠支持海量的數據存儲。 內置了GridFS了MongoDB,可以知足對大數據集的快速範圍查詢。後端

2.內置 Auto- Sharding 自動分片支持雲級擴展性,分片簡單

提供基於Range的Auto Sharding機制:

一個collection可按照記錄的範圍,分紅若干個段,切分到不一樣的Shard上。

Shards能夠和複製結合,配合Replica sets可以實現Sharding+fail-over,不一樣的Shard之間能夠負載均衡。
查詢是對客戶端是透明的。客戶端執行查詢,統計,MapReduce等操做,這些會被MongoDB自動路由到後端的數據節點。
這讓咱們關注於本身的業務,適當的 時候能夠無痛的升級。MongoDB的Sharding設計能力最大可支持約20 petabytes,足以支撐通常應用。
這能夠保證MongoDB運行在便宜的PC服務器集羣上。PC集羣擴充起來很是方便而且成本很低,避免了「sharding」操做的複雜性和成本。

3.海量數據下,性能優越:

在使用場合下,千萬級別的文檔對象,近10G的數據,對有索引的ID的查詢不會比mysql慢,而對非索引字段的查詢,則是全面勝出。 mysql實際沒法勝任大數據量下任意字段的查詢,而mongodb的查詢性能實在讓我驚訝。寫入性能一樣很使人滿意,一樣寫入百萬級別的數 據,mongodb比我之前試用過的couchdb要快得多,基本10分鐘如下能夠解決。補上一句,觀察過程當中mongodb都遠算不上是CPU殺手。

4.全索引支持,擴展到內部對象和內嵌數組

索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。

索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構。

5.MapReduce 支持複雜聚合

MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點相似sql語句中的 count(*)。

與關係型數據庫相比,MongoDB的缺點:

mongodb不支持事務操做:

因此事務要求嚴格的系統(若是銀行系統)確定不能用它。

mongodb不支持事務操做:

因此事務要求嚴格的系統(若是銀行系統)確定不能用它。

mongodb佔用空間過大:

關於其緣由,在官方的FAQ中,提到有以下幾個方面:

一、空間的預分配:爲避免造成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,並且申請的量從64M、128M、256M那 樣的指數遞增,直到2G爲單個文件的最大致積。隨着數據量的增長,你能夠在其數據目錄裏看到這些整塊生成容量不斷遞增的文件。

二、字段名所佔用的空間:爲了保持每一個記錄內的結構信息用於查詢,mongodb須要把每一個字段的key-value都以BSON的形式存儲,若是 value域相對於key域並不大,好比存放數值型的數據,則數據的overhead是最大的。一種減小空間佔用的方法是把字段名儘可能取短一些,這樣佔用 空間就小了,但這就要求在易讀性與空間佔用上做爲權衡了。

三、刪除記錄不釋放空間:這很容易理解,爲避免記錄刪除後的數據的大規模挪動,原記錄空間不刪除,只標記「已刪除」便可,之後還能夠重複利用。

四、能夠按期運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢

MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方。

四、環境須要

64位操做系統,建議使用Linux / Unix /

  • CentOs 7.3
  • MongoDB 3.6.2

五、環境安裝

請參考個人另外一篇文章

搭建 MongoDB分片(sharding) / 分區 / 集羣環境

www.ymq.io/2018/01/30/…

六、新加項目

新建一個 maven 項目,這裏就不詳細操做了,你們都會的

不過也能夠下載個人示例源碼,下載地址以下

GitHub:github.com/souyunku/sp…

碼雲:gitee.com/souyunku/sp…

MongoDB是一個開源NoSQL文檔數據庫,它使用相似JSON的模式而不是傳統的基於表格的關係數據。Spring Boot爲MongoDB提供了一些便利,包括 spring-boot-starter-data-mongodb 「Starter」。

七、添加依賴

在POM 中添加以下依賴

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
複製代碼

八、配置文件

在配置文件 application.properties 添加以下配置

spring.application.name=spring-boot-mongodb
# mongodb
spring.data.mongodb.uri=mongodb://192.168.252.121:20000,192.168.252.122:20000,192.168.252.12:20000/demo
複製代碼

多個IP集羣的配置:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test
複製代碼

九、DemoEntity

spring-data-mongodb中的實體映射是經過MongoMappingConverter這個類實現的。它能夠經過註釋把java類轉換爲mongodb的文檔。

它有如下幾種註釋:

@Id - 文檔的惟一標識,在mongodb中爲ObjectId,它是惟一的,經過時間戳+機器標識+進程ID+自增計數器(確保同一秒內產生的Id不會衝突)構成。

@Document - 把一個java類聲明爲mongodb的文檔,能夠經過collection參數指定這個類對應的文檔。@Document(collection="mongodb") mongodb對應表

@DBRef - 聲明相似於關係數據庫的關聯關係。ps:暫不支持級聯的保存功能,當你在本實例中修改了DERef對象裏面的值時,單獨保存本實例並不能保存DERef引用的對象,它要另外保存,以下面例子的Person和Account。

@Indexed - 聲明該字段須要索引,建索引能夠大大的提升查詢效率。

@CompoundIndex - 複合索引的聲明,建複合索引能夠有效地提升多字段的查詢效率。

@GeoSpatialIndexed - 聲明該字段爲地理信息的索引。

@Transient - 映射忽略的字段,該字段不會保存到mongodb。

@PersistenceConstructor - 聲明構造函數,做用是把從數據庫取出的數據實例化爲對象。該構造函數傳入的值爲從DBObject中取出的數據

package io.ymq.example.mongodb;

@Document(collection = "demo_collection")
public class DemoEntity implements Serializable {

    @Id
    private Long id;

    private String title;

    private String description;

    private String by;

    private String url;
	
	省略 getter setter
}
複製代碼

十、Demo DAO 接口

提供增刪改查 MongoDB 接口

package io.ymq.example.mongodb;

public interface DemoDao {

    void saveDemo(DemoEntity demoEntity);

    void removeDemo(Long id);

    void updateDemo(DemoEntity demoEntity);

    DemoEntity findDemoById(Long id);
}
複製代碼

十一、Demo DAO 實現

提供增刪改查 MongoDB 接口實現

Spring Data Mongo提供了一個 MongoTemplate相似於Spring的設計的類JdbcTemplate。和JdbcTemplateSpring Boot同樣,自動配置一個bean來簡單地注入:

package io.ymq.example.mongodb;

/** * 描述: Demo DAO 實現 * * @author yanpenglei * @create 2018-02-03 16:57 **/
@Component
public class DemoDaoImpl implements DemoDao {

    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void saveDemo(DemoEntity demoEntity) {
        mongoTemplate.save(demoEntity);
    }

    @Override
    public void removeDemo(Long id) {
        mongoTemplate.remove(id);
    }

    @Override
    public void updateDemo(DemoEntity demoEntity) {
        Query query = new Query(Criteria.where("id").is(demoEntity.getId()));

        Update update = new Update();
        update.set("title", demoEntity.getTitle());
        update.set("description", demoEntity.getDescription());
        update.set("by", demoEntity.getBy());
        update.set("url", demoEntity.getUrl());

        mongoTemplate.updateFirst(query, update, DemoEntity.class);
    }

    @Override
    public DemoEntity findDemoById(Long id) {
        Query query = new Query(Criteria.where("id").is(id));
        DemoEntity demoEntity = mongoTemplate.findOne(query, DemoEntity.class);
        return demoEntity;
    }

}
複製代碼

十二、啓動服務

運行啓動類

package io.ymq.example.mongodb;

@SpringBootApplication
public class SpringBootMongodbApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMongodbApplication.class, args);
    }
}
複製代碼

1三、單元測試

單元測試,提供mongodbdemo 庫的 demo_collection 集合的增刪改查

package io.ymq.example.mongodb;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootMongodbApplication.class)
public class SpringBootMongodbApplicationTests {

    @Autowired
    private DemoDao demoDao;

    @Test
    public void saveDemoTest() {

        DemoEntity demoEntity = new DemoEntity();
        demoEntity.setId(1L);
        demoEntity.setTitle("Spring Boot 中使用 MongoDB");
        demoEntity.setDescription("關注公衆號,搜雲庫,專一於開發技術的研究與知識分享");
        demoEntity.setBy("souyunku");
        demoEntity.setUrl("http://www.souyunku.com");

        demoDao.saveDemo(demoEntity);

        demoEntity = new DemoEntity();
        demoEntity.setId(2L);
        demoEntity.setTitle("Spring Boot 中使用 MongoDB");
        demoEntity.setDescription("關注公衆號,搜雲庫,專一於開發技術的研究與知識分享");
        demoEntity.setBy("souyunku");
        demoEntity.setUrl("http://www.souyunku.com");

        demoDao.saveDemo(demoEntity);
    }

    @Test
    public void removeDemoTest() {
        demoDao.removeDemo(2L);
    }

    @Test
    public void updateDemoTest() {

        DemoEntity demoEntity = new DemoEntity();
        demoEntity.setId(1L);
        demoEntity.setTitle("Spring Boot 中使用 MongoDB 更新數據");
        demoEntity.setDescription("關注公衆號,搜雲庫,專一於開發技術的研究與知識分享");
        demoEntity.setBy("souyunku");
        demoEntity.setUrl("http://www.souyunku.com");

        demoDao.updateDemo(demoEntity);
    }

    @Test
    public void findDemoByIdTest() {

        DemoEntity demoEntity = demoDao.findDemoById(1L);

        System.out.println(JSONObject.toJSONString(demoEntity));
    }
}
複製代碼

擴展閱讀

手把手教你 MongoDB 的安裝與詳細使用(一)

www.ymq.io/2018/01/26/…

手把手教你 MongoDB 的安裝與詳細使用(二)

www.ymq.io/2018/01/29/…

源碼下載

GitHub:github.com/souyunku/sp…

碼雲:gitee.com/souyunku/sp…

福利

Spring Boot 學習教程 會不定時更新技術, 歡迎 Star 和 Fork。

github.com/souyunku/sp…

github.com/souyunku/sp…

參考:docs.spring.io/spring-boot…

Contact

關注公衆號-搜雲庫
搜雲庫
相關文章
相關標籤/搜索