文檔數據庫-MongoDB

目錄

1.配置MongoDB

2.使用MongoTemplate實例

2.1 用戶POJO

2.2 Controller

2.3使用MongoTemplate操作文檔


Redis的執行速度遠超關係型數據庫,可以極大地提高系統的性能,但是它有一些致命的缺陷,其中最爲嚴重的就是計算功能十分有限,例如,在一個10萬數據量的List中,我只需要滿足特定條件的元素,這時我們需要先把元素取出,然後通過條件去篩選得到我們想要的數據,這顯然存在比較大的問題。當然,我們可以通過Lua腳本去完善,只是這樣對於開發者的工作量就大大地增加了。

對於那些需要緩存而且經常需要統計、分析和查詢的數據,對於Redis這樣簡單的NoSQL顯然就不是那麼便捷了,這時我們可以採用MongoDB數據庫。對於那些需要統計,按條件查詢和分析的數據,它提供了支持。

MongoDB是由C++語言編寫的一種NoSQL,是一個基於分佈式文件存儲的開源數據庫系統。在負載高時可以添加更多的節點,以保證服務器的性能,MongoDB的目的是爲Web應用提供可擴展的高性能數據存儲解決方案。MongoDB將數據存儲爲一個文檔,數據結構由鍵值對組成。MongoDB文檔類似於JSON數據集,所以很容易轉化爲Java POJO對象或者JavaScript對象。

1.配置MongoDB

首先需要引入MongoDB的starter:

        <!--引入MongoDB的starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

然後安裝MongoDB,安裝的地址爲:https://blog.csdn.net/heshengfu1211/article/details/94218337

MongoDB配置信息如下:

spring.data.mongodb.host=192.168.0.1
spring.data.mongodb.database=test
spring.data.mongodb.username=mongod
spring.data.mongodb.password=test
spring.data.mongodb.port=27017

有了上述配置信息之後,SpringBoot會自動爲我們創建關於MongoDB的Spring Bean,自動創建的Bean信息如下:

2.使用MongoTemplate實例

我們主要使用MongoTemplate實例進行操作數據,SpringBoot會根據配置自動生成這個對象,所以我們不需要自己去創建。

2.1 用戶POJO

UserDO代碼如下:

package com.martin.config.mongodb;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;
import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
//標識爲MongoDB
@Document
@Data
public class UserDO implements Serializable {
    //MongoDB文檔編號,主鍵
    @Id
    private Long id;
    //在MongoDB中使用user_name保存屬性
    @Field("user_name")
    private String userName;
    //角色列表
    private List<Role> roles;
}

文檔被標識爲@Document,這說明它將作爲MongoDB的文檔存在,@id註解則將對應的字段設置爲主鍵,@Field註解將屬性userName與MongoDB中的user_name屬性對應起來。

Role代碼如下:

package com.martin.config.mongodb;

import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;

/**
 * @author: martin
 * @date: 2020/2/4
 */
@Document
@Data
public class Role implements Serializable {
    private Long id;
    @Field("role_name")
    private String roleName;
    private String note;
}

這裏繼續使用@Document註解,標明Role是一個單獨的MongoDB文檔。如果我們只是在UserDO中使用角色,沒有別的使用場景,也可以不使用@Document註解。

2.2 Controller

用戶控制器的實例代碼如下:

package com.martin.config.controller;

import com.martin.config.mongodb.UserDO;
import com.martin.config.service.MongoUserService;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
@Controller
@RequestMapping("/mongo")
public class UserController {
    @Autowired
    private MongoUserService userService;

    @RequestMapping("/save")
    @ResponseBody
    public UserDO saveUser(@RequestBody UserDO user) {
        userService.saveUser(user);
        return user;
    }

    @RequestMapping("/get")
    @ResponseBody
    public UserDO getUser(Long id) {
        return userService.getUser(id);
    }

    @RequestMapping("/find")
    @ResponseBody
    public List<UserDO> findUsers(String userName, String note, Integer skip, Integer limit) {
        return userService.findUser(userName, note, skip, limit);
    }

    @RequestMapping("/update")
    @ResponseBody
    public UpdateResult updateUser(Long id, String userName, String note) {
        return userService.updateUser(id, userName, note);
    }

    @RequestMapping("/delete")
    @ResponseBody
    public DeleteResult deleteResult(Long id) {
        return userService.deleteUser(id);
    }


}

這裏引入了MongoUserService接口,下面我們討論一下該接口的具體實現。

2.3使用MongoTemplate操作文檔

首先定義用戶服務接口MongoUserService,代碼如下:

package com.martin.config.service;

import com.martin.config.mongodb.UserDO;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;

import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
public interface MongoUserService {
    void saveUser(UserDO userDO);

    DeleteResult deleteUser(Long id);

    /**
     * 查詢用戶
     *
     * @param userName 用戶名稱
     * @param note     備註
     * @param skip     跳過用戶個數
     * @param limit    限制返回用戶個數
     * @return
     */
    List<UserDO> findUser(String userName, String note, int skip, int limit);

    /**
     * 更新用戶部分屬性
     *
     * @param id       用戶編號
     * @param userName 用戶名稱
     * @param note     備註
     * @return
     */
    UpdateResult updateUser(Long id, String userName, String note);

    UserDO getUser(Long id);
}

方法的含義比較簡單,包含了增刪改查等功能。

實現類MongoUserServiceImpl的實例代碼如下:

package com.martin.config.service.impl;

import com.martin.config.mongodb.UserDO;
import com.martin.config.service.MongoUserService;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
@Service
public class MongoUserServiceImpl implements MongoUserService {
    //注入mongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void saveUser(UserDO userDO) {
        mongoTemplate.save(userDO);
    }

    @Override
    public DeleteResult deleteUser(Long id) {
        //構建id相等的條件
        Criteria criteriaId = Criteria.where("id").is(id);
        //查詢對象
        Query queryId = Query.query(criteriaId);
        //刪除用戶
        return mongoTemplate.remove(queryId, UserDO.class);
    }

    @Override
    public List<UserDO> findUser(String userName, String note, int skip, int limit) {
        //將用戶名稱和備註設置爲模糊查詢準則
        Criteria criteria = Criteria.where("userName").regex(userName).and("note").regex(note);
        //構建查詢條件,並設置分頁跳過前skip個,至多返回limit個
        Query query = Query.query(criteria).limit(limit).skip(skip);

        return mongoTemplate.find(query, UserDO.class);
    }

    @Override
    public UpdateResult updateUser(Long id, String userName, String note) {
        //確定更新的對象
        Criteria criteriaId = Criteria.where("id").is(id);
        Query query = Query.query(criteriaId);
        //定義更新對象
        Update update = Update.update("userName", userName);
        update.set("note", note);

        return mongoTemplate.updateMulti(query, update, UserDO.class);
    }

    @Override
    public UserDO getUser(Long id) {
        return mongoTemplate.findById(id, UserDO.class);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章