1.MonogoDB VS MySql
MongoDB預設是
B樹,MySQL預設是
B+樹。
為什麼這樣選擇,是因為兩者的使用場景不同。一般MongoDB
查單條資料的情景比較多,使用B樹作為索引底層資料結構,因為
索引節點可以存儲資料,是以就不需要去葉子節點擷取資料了。
是以查詢一條資料所需要的平均随機 IO 次數會比 B+ 樹少,因為IO的次數和我們的層高有關系,使用B樹的MongoDB 在類似場景中的查詢速度就會比 MySQL快,緻命的缺陷是由于衛星資料在哪兒都是,是以很不适合範圍查詢。
1.1 兩者速度比較
1.針對寫入操作
MongoDB的寫入速度更快。寫操作MongoDB比傳統資料庫快的根本原因是Mongo使用的
記憶體映射技術寫入資料時候隻要在記憶體裡完成就可以傳回給應用程式,這樣并發量自然就很高。而儲存到硬體的操作則在
背景異步完成。注意MongoDB在2.4就已經是預設安全寫了(具體實作在驅動程式裡)
2.針對讀取操作
先說結論:如果是針對等值查詢(如=1),MongoDB會更快一些。但針對範圍查詢,則MySQL更快一些。
讀操作MongoDB快的原因是:
1)MongoDB的設計要求你常用的資料(working set)可以在記憶體裡裝下。這樣大部分操作隻需要讀記憶體,自然很快。
2)文檔性模式設計一般會是的你所需要的資料都相對集中在一起(記憶體或硬碟),大家知道硬碟讀寫耗時最多是
随機讀寫所産生的
磁頭定位時間也就是我們常說的尋道和尋址時間,資料集中在一起則減少了關系性資料庫需要從各個地方去把資料找過來(然後Join)所耗費的随機讀時間
1.2 從索引上看兩者差別
(1)mysql的索引有唯一索引、主鍵索引、聯合索引、普通索引。MongoDB的索引支援地理位置索引、全文索引、哈希索引。
(2)msyql的主鍵索引可以指定1到N列作為主鍵索引,而MongoDB的主鍵索引指定為_id字段
2.monogoDB簡介
傳統的關系資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由資料庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關系型資料庫裡的表,但是集合中沒有列、行和關系概念,這展現了模式自由的特點。
MonogoDB存儲資料的格式為BJSON格式,BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON,它和JSON一樣,支援内嵌的文檔對象和數組對象,但是BSON有JSON沒有的一些資料類型,如Date和Binary Data類型。
BSON可以做為網絡資料交換的一種存儲形式,是一種schema-less的存儲形式。
它的優點是靈活性高,但它的缺點是空間使用率不是很理想。
{key:value,key2:value2} 這是一個BSON的例子,其中key是字元串類型,後面的value值,它的類型一般是字元串,double,Array,ISODate等類型。
BSON有三個特點:輕量性、可周遊性、高效性
3.SpringBoot內建monogoDB實戰
3.1 安裝MonogoDB資料庫
我是通過docker安裝的,其他需要安裝至本地的可以自行百度一下
《docker安裝monogoDB》
3.2 添加maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.3 添加配置資訊
spring:
data:
mongodb:
host: 192.168.1.2
port: 27017
password: root
username: admin
database: admin #指定操作的資料庫
注意:我的使用者:admin隻對admin庫有操作權限,自己在建立角色時要注意
3.4 添加實體類
在添加實體類之前,我們先确定一個應用場景,我們以考試子產品為例,我們可以将題庫資訊存儲進去,也就是存我們的題目資訊
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;
@Data
@Document("problem")
public class TbProblem {
@Id
private Integer problemId;
//pid=0說明是題目,否則是選項
@Field
private Integer pid;
//題目所屬的課程Id
@Field
private Integer courseId;
//内容
@Field
private String content;
//答案
@Field
private String answer;
//類型1-單選;2-多選
@Field
private Integer type;
}
添加monogodb的操作
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Update;
import java.util.List;
public interface MonogoService {
//建立集合
public void createCollection(String collectionName);
//插入文檔
public <T> T insert(T t);
//删除集合
public void deleteCollection(String collectionName);
//删除所有文檔
public DeleteResult deleteAllDocument(Class T);
//條件删除文檔
public DeleteResult deleteDocumentByQueriter(Criteria criteria, Class T);
//更新符合條件的第一條資料
UpdateResult updateFirst(Update update, Criteria criteria, Class T);
//更新符合條件的所有資料
UpdateResult update(Update update, Criteria criteria, Class T);
//擷取所有
<T> List<T> getAll(Class<T> t);
//根據id查詢
public <T> T findById(int id, Class<T> t);
//通過條件查詢
public <T> List<T> findByQuery(Criteria criteria, Class<T> t);
//擷取數量
public Long getCount(Class t);
}
實作類:
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
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 javax.annotation.Resource;
import java.util.List;
@Service
public class MonogoServiceImpl implements MonogoService {
@Resource
MongoTemplate mongoTemplate;
@Override
public void createCollection(String collectionName) {
mongoTemplate.createCollection(collectionName);
}
@Override
public void deleteCollection(String collectionName) {
mongoTemplate.dropCollection(collectionName);
}
@Override
public DeleteResult deleteAllDocument(Class T) {
//條件删除
DeleteResult deleteResult = mongoTemplate.remove(new Query(), T);
return deleteResult;
}
@Override
public DeleteResult deleteDocumentByQueriter(Criteria criteria, Class T) {
return null;
}
@Override
public UpdateResult updateFirst(Update update, Criteria criteria, Class T) {
return mongoTemplate.updateFirst(Query.query(criteria), update, T);
}
@Override
public UpdateResult update(Update update, Criteria criteria, Class T) {
return mongoTemplate.updateMulti(Query.query(criteria), update, T);
}
@Override
public <T> List<T> getAll(Class<T> t) {
return mongoTemplate.findAll(t);
}
@Override
public <T> T findById(int id, Class<T> t) {
T re = mongoTemplate.findById(id, t);
return re;
}
@Override
public <T> List<T> findByQuery(Criteria criteria, Class<T> t) {
Query query = Query.query(criteria);
List<T> res = mongoTemplate.find(query, t);
return res;
}
@Override
public Long getCount(Class t) {
long count = mongoTemplate.count(new Query(), t);
return count;
}
@Override
public <T> T insert(T t) {
T re = mongoTemplate.save(t);
return re;
}
}
Controller:
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.Update;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class TestController {
@Autowired
MonogoService monogoService;
/**
* 建立集合
*/
@GetMapping("createCollection")
public void createCollection(@RequestParam("collectionName") String collectionName) {
monogoService.createCollection(collectionName);
}
/**
* 插入文檔
*/
@GetMapping("insert")
public TbProblem insert() {
TbProblem tbProblem = new TbProblem();
Double val = Math.random() * 10 + 1;
tbProblem.setProblemId((val).intValue());
tbProblem.setContent("monogoDB有哪些注意事項");
tbProblem.setAnswer("12");
tbProblem.setPid(0);
tbProblem.setType(1);
tbProblem.setCourseId(1);
return monogoService.insert(tbProblem);
}
/**
* 删除集合
*/
@GetMapping("deleteCollection")
public void deleteCollection() {
monogoService.deleteCollection("problemBank");
}
/**
* 删除所有文檔
*/
@GetMapping("deleteAllDocument")
public DeleteResult deleteAllDocument() {
return monogoService.deleteAllDocument(TbProblem.class);
}
/**
* 條件删除文檔
*/
@GetMapping("deleteDocumentByQueriter")
public DeleteResult deleteDocumentByQueriter() {
Criteria criteria = new Criteria();
criteria.where("problemId").is(1);
return monogoService.deleteDocumentByQueriter(criteria, TbProblem.class);
}
/**
* 更新符合條件的第一條資料
*/
@GetMapping("updateFirst")
public UpdateResult updateFirst() {
Update update = new Update();
update.set("pid", 1);
Criteria criteria = new Criteria();
criteria.where("pid").is(0);
return monogoService.updateFirst(update, criteria, TbProblem.class);
}
/**
* 更新符合條件的所有資料
*/
@GetMapping("update")
public UpdateResult update() {
Update update = new Update();
update.set("pid", 2);
Criteria criteria = new Criteria();
criteria.where("pid").is(0);
return monogoService.update(update, criteria, TbProblem.class);
}
/**
* 擷取所有
*/
@GetMapping("getAll")
public List<TbProblem> getAll() {
return monogoService.getAll(TbProblem.class);
}
/**
* 根據id查詢
*/
@GetMapping("findById")
public TbProblem findById() {
return monogoService.findById(1, TbProblem.class);
}
/**
* 通過條件查詢
*/
@GetMapping("findByQuery")
public List<TbProblem> findByQuery() {
Criteria criteria = new Criteria();
criteria.where("pid").is(0);
return monogoService.findByQuery(criteria, TbProblem.class);
}
/**
* 通過條件查詢
* and or
*/
@GetMapping("findByQuery1")
public List<TbProblem> findByQuery1() {
Criteria criteria = new Criteria();
criteria.where("pid").is(0).and("id").is(1);
return monogoService.findByQuery(criteria, TbProblem.class);
}
/**
* 通過條件查詢
* and or
*/
@GetMapping("findByQuery2")
public List<TbProblem> findByQuery2() {
Criteria criteriaAndOr = new Criteria();
criteriaAndOr.and("pid").is(0)
.orOperator(
Criteria.where("pid").is(1),
Criteria.where("courseId").is(2)
);
return monogoService.findByQuery(criteriaAndOr, TbProblem.class);
}
}
測試:
- 通路:http://localhost:8080/createCollection?collectionName=problemBank
- 通路:http://localhost:8080/insert
-
通路:http://localhost:8080/deleteCollection
可以到資料庫中檢視,會發現problemBank已經沒了
-
通路:http://localhost:8080/deleteAllDocument
可以發現tbProblem中資料已經清空了
-
通路:http://localhost:8080/deleteDocumentByQueriter
可以發現tbProblem中主鍵為1的已經清空了
- 通路:http://localhost:8080/updateFirst
下面的自己自行測試即可。
至此,monogoDB的基本操作,我們就完成了。