得閑,尋一數(shù)據(jù)庫(kù)學(xué)習(xí)一番,突遇mongo透且,早有耳聞痴施,今有空鉆研娘摔,耍耍碰煌。
一太雨、比較懶蕊退,所以用 docker 部署 mongoDB
1. 打開docker hub官網(wǎng)找到 mongodb 或者輸入命令 docker search mongodb
2. 下載鏡像:docker pull mongo (或者一步到位验夯,直接執(zhí)行第三步)
3. 運(yùn)行鏡像容器:
docker run -d --name my-mongo -p 27017:27017 -v $PWD/mongo/data/db:/data/db mongo
4. 容器啟動(dòng)成功后猖吴,可以先用navicat連接測(cè)試一下,然后會(huì)發(fā)現(xiàn)不需要登錄挥转,這是因?yàn)檫€沒(méi)有創(chuàng)建用戶
# 使用docker exec 進(jìn)入容器內(nèi)部海蔽,進(jìn)一步創(chuàng)建用戶
docker exec -it my-mongo mongo admin
# 創(chuàng)建一個(gè)名為 admin,密碼為 admin 的用戶绑谣。
> db.createUser({ user:'admin',pwd:'admin',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});
# 嘗試使用上面創(chuàng)建的用戶信息進(jìn)行連接党窜。
> db.auth('admin', 'admin')
自此,這個(gè)admin用戶就創(chuàng)建好了(具體請(qǐng)參考菜鳥教程)
二借宵、整合spring boot試試幌衣,試試就逝世
- 隨便找一個(gè)2.X以上版本的spring boot項(xiàng)目,在pom文件引入依賴
<!--MongoDB-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
- 創(chuàng)建一個(gè)POJO壤玫,用來(lái)往mongo里存數(shù)據(jù)豁护,
@Data
// 表示這個(gè)對(duì)象對(duì)應(yīng)的是mongodb庫(kù)里的mongo_test集合(mongo把表稱為集合,其實(shí)都一個(gè)意思)
@Document(collection = "mongo_test")
public class MongoEntity implements Serializable {
private String name;
/**
* @Indexed 設(shè)為索引 到后來(lái)發(fā)現(xiàn)欲间,mongo 3.x以上的版本不推薦這么建索引,所以可以不加這個(gè)注解
* unique = true 唯一索引(即:不可重復(fù))
*/
@Indexed(unique = true)
private String certCode;
private Integer age;
private Date createTime;
private Date updateTime;
}
- 創(chuàng)建完之后發(fā)現(xiàn)楚里,配置文件還沒(méi)配,趕緊回去配猎贴,打開application.yml
data:
mongodb:
# 有兩種方式班缎,可以任選其一,不過(guò)我比較推薦第一種她渴,因?yàn)榈诙N容易報(bào)錯(cuò)(我覺(jué)得第二種达址,更適合集群)
# 第一種配置:
host: 你的host
port: 27017
database: test1
username: admin
password: admin
authentication-database: admin
# 第二種配置:(我沒(méi)成功,報(bào)錯(cuò))
# uri: mongodb://admin:admin@你的host:27017/test1
- 像redis一樣,mongo也有自己的Template 惹骂,MongoTemplate
// 首先要注入進(jìn)來(lái)
@Resource
MongoTemplate mongoTemplate;
//比如我要查集合下所有數(shù)據(jù)
List<MongoEntity> allInfo = mongoTemplate.findAll(MongoEntity.class);
//又或者我要新增數(shù)據(jù)
mongoTemplate.insert(mongo);
和redis一樣苏携,Template中的方法命名幾乎都是和其命令是一樣的做瞪。因此熟悉命令后对粪,調(diào)用方法也運(yùn)用自如。
詳情請(qǐng)參考荒天帝886的文章
三装蓬、能一帆風(fēng)順來(lái)到你面前的不是成功著拭,而是一堆堆報(bào)錯(cuò)(避坑指南)
1. 配置文件的配置很少,卻容易失敗牍帚。
如果你用第二種單uri的配置可能出現(xiàn)以下報(bào)錯(cuò):
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.'
MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='admin', source='test1', password=<hidden>, mechanismProperties=<hidden>}
提示我password是空的儡遮,行,那我去找找大神們是怎么配的暗赶,難道我格式不對(duì)鄙币?于是我點(diǎn)開了這篇文章肃叶。
然后證實(shí)了,我的配置是正確的(因?yàn)樵谂渲熬鸵呀?jīng)查閱過(guò)資料了)十嘿。這個(gè)見鬼的問(wèn)題目前我還沒(méi)弄明白(你們誰(shuí)知道因惭,可以留言告訴我),所以為了能快點(diǎn)使用mongo绩衷,經(jīng)過(guò)多方查找蹦魔,我找到了第一種配置方法,結(jié)果成功了咳燕。
2. 加索引的問(wèn)題
起初我是在項(xiàng)目運(yùn)行時(shí)的日志里看到的勿决,他是這么說(shuō)的:
2020-09-10 11:36:15.444 WARN 12924 --- [ main] .m.c.i.MongoPersistentEntityIndexCreator : Automatic index creation will be disabled by default as of Spring Data MongoDB 3.x.
Please use 'MongoMappingContext#setAutoIndexCreation(boolean)' or override 'MongoConfigurationSupport#autoIndexCreation()' to be explicit.
However, we recommend setting up indices manually in an application ready block. You may use index derivation there as well.
> -----------------------------------------------------------------------------------------
> @EventListener(ApplicationReadyEvent.class)
> public void initIndicesAfterStartup() {
>
> IndexOperations indexOps = mongoTemplate.indexOps(DomainType.class);
>
> IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
> resolver.resolveIndexFor(DomainType.class).forEach(indexOps::ensureIndex);
> }
> -----------------------------------------------------------------------------------------
大致意思就是,3.x以后的版本招盲,不能自動(dòng)給你建索引了低缩,你最好自己手動(dòng)建一個(gè)∠苄ぃ看完之后表制,我想既然WARN級(jí)別,那應(yīng)該問(wèn)題不大控乾,所以我先看了看庫(kù)里有沒(méi)有加上這個(gè)索引么介,看了之后發(fā)現(xiàn),的確有了:
不過(guò)既然提示了蜕衡,那就看看能不能解決一下吧壤短,度娘那找找答案去。
于是我找到了這篇文章
慨仿,借鑒一下他的方法:
也就是說(shuō)我還得寫個(gè)config了久脯,好麻煩,等以后我試試吧镰吆。
總之這是個(gè)官方建議帘撰,如果真的用了注解來(lái)建索引,也不是不可以万皿。