docker安裝mongoDB及使用方法詳解
一、mongoDB是什么?
MongoDB是一個NoSQL的非關(guān)系型數(shù)據(jù)庫 ,支持海量數(shù)據(jù)存儲,高性能的讀寫。
1. mongo的體系結(jié)構(gòu)

- mongo中的集合相當(dāng)于mysql中表的概念;
- mongo中的文檔相當(dāng)于mysql中行的概念;
- mongo中的域相當(dāng)于mysql中字段/列的概念;
2. mongoDB的特點(diǎn)(或使用場景)
- 支持存儲海量數(shù)據(jù);(例如:直播中的打賞數(shù)據(jù));
- 支持頻繁的數(shù)據(jù)讀寫;(例如:游戲道具);
- 數(shù)據(jù)安全性不高,存在數(shù)據(jù)誤差(丟失數(shù)據(jù));
- mongoDB不支持多表操作,不支持事務(wù);
- mongoDB使用Bson存儲格式,支持動態(tài)字段管理;
3. mongoDB與mysql、redis對比
與redis對比
1. redis純內(nèi)存數(shù)據(jù)庫,內(nèi)存不足時觸發(fā)淘汰策略,mongoDB使用內(nèi)存加磁盤的存儲策略具有高擴(kuò)展性;
2. mongoDB使用Bson存儲格式,支持動態(tài)字段管理方便擴(kuò)展;
與mysql對比
1. mongoDB不支持多表操作,不支持事務(wù);
2. mongoDB使用Bson存儲格式,支持動態(tài)字段管理;
查詢效率對比
Redis > MongoDB > MySQL
4. mongoDB存儲原理

- mongoDb采用內(nèi)存加磁盤的方式存儲數(shù)據(jù);
- mongoDb支持?jǐn)?shù)據(jù)分片,當(dāng)單一的服務(wù)器中磁盤不夠用的時候,還可以串聯(lián)其他服務(wù)器;
- 客戶端的請求到達(dá)內(nèi)存時,先在日志中記錄下操作記錄,然后再去操作內(nèi)存;
- 內(nèi)存中的日志每10ms向磁盤中的日志進(jìn)行同步一次,數(shù)據(jù)則每分鐘同步一次;
- 客戶端先去內(nèi)存中查詢數(shù)據(jù),內(nèi)存中沒有再去查詢磁盤;
- 當(dāng)客戶端寫入的時候,會先寫入到內(nèi)存中,內(nèi)存中寫入后請求直接返回,內(nèi)存中的數(shù)據(jù)會根據(jù)同步策略同步到磁盤;
- 如果機(jī)器宕機(jī),在重啟服務(wù)的時候會解析磁盤中的日志和磁盤中的數(shù)據(jù)進(jìn)行對比,將未入到磁盤中的數(shù)據(jù)寫入磁盤,但可能會丟失10ms的數(shù)據(jù);
二、使用docker安裝mongo
1.安裝
拉取mongo鏡像
docker pull mongo:4.4
創(chuàng)建mongo數(shù)據(jù)持久化目錄
mkdir -p /docker_volume/mongodb/data
運(yùn)行容器
docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
-v: 將宿主機(jī)的/docker_volume/mongodb/data映射到容器的/data/db目錄,將數(shù)據(jù)持久化到宿主機(jī),以防止刪除容器后,容器內(nèi)的數(shù)據(jù)丟失
–auth:需要密碼才能訪問容器服務(wù)
2.創(chuàng)建用戶
登錄mongo容器,并進(jìn)入到【admin】數(shù)據(jù)庫
docker exec -it mongo mongo admin
創(chuàng)建一個用戶,mongo 默認(rèn)沒有用戶
db.createUser({<!--{C}%3C!%2D%2D%20%2D%2D%3E--> user:'root',pwd:'123456',roles:[ {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});【user:‘root’ 】:設(shè)置用戶名為root
【pwd:‘123456’】:設(shè)置密碼為123456
【role:‘userAdminAnyDatabase’】:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限
【db: ‘admin’】:可操作的數(shù)據(jù)庫
【‘readWriteAnyDatabase’】:賦予用戶讀寫權(quán)限
dbAdmin:允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問system.profile
3. 連接、測試
連接mongo數(shù)據(jù)庫
db.auth('root', '123456')測試數(shù)據(jù)庫,插入一條語句
db.user.insert({<!--{C}%3C!%2D%2D%20%2D%2D%3E-->"name":"zhangsan","age":18})測試數(shù)據(jù)庫,查詢剛才插入的語句
db.user.find()

navicat連接測試

三、SpringBoot整合mongoDB
導(dǎo)入坐標(biāo)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
添加yml配置
spring:
data:
mongodb:
uri: mongodb://192.156.136.168:27017/testdb
username: root
password: 123456
編寫實(shí)體類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Data
@AllArgsConstructor
@NoArgsConstructor
//指定實(shí)體類和數(shù)據(jù)庫文檔的映射關(guān)系 默認(rèn)實(shí)體類名 數(shù)據(jù)庫如果沒有該文檔,會自動創(chuàng)建
@Document(value="tb_person")
public class Person {
@Id
private ObjectId id; //mongoDB推薦使用ID
//指定屬性名和數(shù)據(jù)庫域的映射關(guān)系 默認(rèn)屬性名
@Field("person_name")
private String name;
private int age;
private String address;
}
1.@Document(value=“tb_person”) :指定實(shí)體類和數(shù)據(jù)庫文檔的映射關(guān)系 默認(rèn)實(shí)體類名 數(shù)據(jù)庫如果沒有該文檔,會自動創(chuàng)建
2. @Field(“person_name”): //指定屬性名和數(shù)據(jù)庫域的映射關(guān)系 默認(rèn)屬性名
測試類
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
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.test.context.junit4.SpringRunner;
/**
* 多條件查詢
*/
@Test
public void find() {
//設(shè)置查詢條件 age小于30,且person_name="張三"
Criteria criteria = Criteria.where("age").lt(30)
.and("person_name").is("張三");
//設(shè)置查詢條件
Query query = new Query(criteria);
//查詢
List<Person> list = mongoTemplate.find(query, Person.class);
for (Person person : list) {
System.out.println(person);
}
}
/**
* 分頁查詢
*/
@Test
public void findPage() {
//設(shè)置查詢條件 age小于30,且person_name="張三"
Criteria criteria = Criteria.where("age").lt(30)
.and("person_name").is("張三");
//根據(jù)條件 查詢總數(shù)
Query queryCount = new Query(criteria);
long count = mongoTemplate.count(queryCount, Person.class);
//查詢當(dāng)前頁的數(shù)據(jù)列表, 查詢第二頁,每頁查詢2條
Query queryLimit = new Query(criteria)
.with(Sort.by(Sort.Order.desc("age")))
.limit(2)//每頁查詢條數(shù)
.skip(2); //從第幾頁開始 (page-1)*size
List<Person> list = mongoTemplate.find(queryLimit, Person.class);
for (Person person : list) {
System.out.println(person);
}
}
/**
* 更新數(shù)據(jù)
*/
@Test
public void update() {
//設(shè)置查詢條件 age小于30,且person_name="張三"
Criteria criteria = Criteria.where("person_name").is("王五");
//設(shè)置更新條件
Query query = new Query(criteria);
//設(shè)置更新數(shù)據(jù)
Update update = new Update();
update.set("age", 16);
mongoTemplate.upsert(query, update, Person.class);
}
/**
* 保存
*/
@Test
public void save() {
Person person = new Person();
person.setName("張三");
person.setAge(18);
mongoTemplate.save(person);
}
/**
* 刪除數(shù)據(jù)
*/
@Test
public void dlete() {
mongoTemplate.remove(Query.query(Criteria.where("person_name").is("張三")), Person.class);
}
mongoDB索引
提示:1 :升序索引 -1 :降序索引
#查看索引
db.user.getIndexes()
#創(chuàng)建索引
#db.user.createIndex({'age':1})
四、mongoDB原生使用
新增
db.tb_person.insert({person_name: "陳六", age: 16})
修改
-- 普通修改
db.tb_person.update({age: 16}, {$set: {person_name: "張三"}})
修改格式:db.collection.update(query, update, [ upsert: boolean, multi: boolean, writeConcern: document])
db.tb_person.update({age: 16}, {$set: {person_name: "張三"}}, {upsert: true, multi: true})
-- upsert (默認(rèn)false ) : 可選,如果不存在update的記錄,是否保存。true為保存。
-- multi(默認(rèn)false ) : 可選,默認(rèn)只更新第一條記錄。true:更新所有匹配數(shù)據(jù)
-- writeConcern :可選,拋出異常的級別
刪除
-- 普通刪除
db.tb_person.remove({person_name: "張三"})
刪除格式:db.collection.remove(query, update, [ justOne: boolean, writeConcern: document])
db.tb_person.remove({person_name: "張三"}, false)
-- justOne: (可選)true:刪除第一個匹配記錄,false:刪除所有
-- writeConcern :(可選)拋出異常的級別
查詢
-- 查詢person_name=張三 或者 年齡 18
db.tb_person.find({$or:[{person_name: "張三"},{age:18 }]})
-- 分頁查詢 以年齡升序排序 跳過第1條數(shù)據(jù),查詢后面2條數(shù)據(jù)
db.tb_person.find().sort({age:1}).limit(2).skip(1)
-- 查詢年齡小于等于21的數(shù)據(jù),以年齡降序排序
db.tb_person.find({age:{$lte:21}}).sort({age:-1})
常用查詢條件
| 中文 | 符號 |
|---|---|
| 小于 | $lt: |
| 大于 | $gt: |
| 小于或等于 | $lte: |
| 大于或等于 | $gte: |
| 不等于 | $ne: |
總結(jié)
到此這篇關(guān)于docker安裝mongoDB及使用方法的文章就介紹到這了,更多相關(guān)docker安裝mongoDB內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker查看正在運(yùn)行的容器目錄的實(shí)現(xiàn)方式
這篇文章主要介紹了Docker查看正在運(yùn)行的容器目錄的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
詳解Docker 配置國內(nèi)免費(fèi)registry mirror
本篇文章主要介紹了 Docker 配置國內(nèi)免費(fèi)registry mirror,具有一定的參考價值,有興趣的小伙伴們可以參考一下2017-07-07
docker報(bào)錯Container is not running問題及解決
這篇文章主要介紹了docker報(bào)錯Container is not running問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
Jenkins Pipeline中Docker鏡像構(gòu)建與推送的常見問題及解決方案
在現(xiàn)代 DevOps 實(shí)踐中,Jenkins 作為一款流行的持續(xù)集成和持續(xù)交付(CI/CD)工具,被廣泛應(yīng)用于自動化構(gòu)建、測試和部署流程,然而,在實(shí)際使用 Jenkins Pipeline 進(jìn)行 Docker 鏡像構(gòu)建和推送的過程中,可能會遇到各種問題,本文將通過一個具體的案例給大家詳細(xì)的介紹一下2025-01-01
docker-compose安裝部署NebulaGraph圖數(shù)據(jù)庫的詳細(xì)過程
NebulaGraph Studio是一款可以通過Web訪問的開源圖數(shù)據(jù)庫可視化工具,搭配NebulaGraph內(nèi)核使用,提供構(gòu)圖、數(shù)據(jù)導(dǎo)入、編寫nGQL查詢等一站式服務(wù),這篇文章主要介紹了docker-compose安裝部署NebulaGraph圖數(shù)據(jù)庫的詳細(xì)過程,感興趣的朋友一起看看吧2023-12-12

