前言:空余时间研究下MongoDB,它作为典型的NoSQL数据库,存储JSON格式的数据十分方便,本文将会记录安装和使用的部分方法。

一. 安装与配置

方法一:MongoDB Cloud

推荐使用MongoDB Cloud服务(支持创建免费云数据库),详见:https://cloud.mongodb.com/

方法二:利用Docker安装

需要下载镜像,推荐选择4.4版本,目前最新版为5.0,5.0后会对saslContinue参数严格校验,配置略微麻烦一点。

1
2
3
4
5
6
7
8
9
10
11
12
docker pull mongo:4.4

docker run -itd --name mongo -p 27017:27017 mongo:4.4 --auth

# 通过容器名称进入容器内部,并以admin账号登陆mongo
docker exec -it mongo mongo admin

# 容器内部执行指令
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'root', db: 'admin'}]});

# 返回1则成功
db.auth('root', '123456')

方法三:本机安装

如果是安装在本机上(安装过程略),需要进行以下配置:

1)先配置管理员用户

1
2
3
> use admin #进入admin数据库
switched to db admin
> db.createUser({user:"admin",pwd:"admin",roles:[{role:"root", db:"admin"}]})

2)配置文件修改

1
2
3
4
5
net:
port: 27017
bindIp: 0.0.0.0 # 要远程访问注意改这里
security:
authorization: enabled # 如果忘记密码把这行注释掉,然后改用户

二. 在SpringBoot中使用

配置

1)pom.xml中添加依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2)配置application.yml

1
2
3
4
5
6
7
8
9
spring:
data:
mongodb:
authentication-database: admin
database: test
username: admin
password: admin123456
host: 127.0.0.1
port: 27017

映射

只需要在对应实体类上加注解:

1
@Document(collection = "user")    // collection值为集合名

自定义id

插入记录时,MongoDB会自动生成一条不重复的_id字段,若想自定义,可以通过@MongoId注解

1
2
@MongoId
private String title;

使用

1)直接存储 JSONObject

1
2
3
4
5
6
@Autowired
private MongoTemplate mongoTemplate;

public void test(){
mongoTemplate.save(JSONObject对象, 集合名);
}

使用MongoRepository进行CRUD

使用MongoTemplate进行CRUD

https://blog.csdn.net/liboyang71/article/details/87916549

三. 部分原生操作

3.1 权限操作

1
2
3
4
5
6
7
8
/*  切换到 admin 用户下  */
use admin
/* 查看当前的用户 */
db.system.users.find()
/* 删除现有用户 */
db.system.users.remove({})
/* 创建新用户 */
db.createUser({user:"root",pwd:"test123",roles:[{role:"root", db:"admin"}]})

3.2 原生查询

1
2
3
4
5
/* 查询指定key-value */
db.getCollection("CET4_2").find({"content.word.wordId":"CET4_2_1"}).pretty()

/* 查询某字段去重后总数 */
db.getCollection('CET4_2').distinct("content.word.wordId").length

3.3 遍历替换旧数据

可以用于旧数据需要批量替换成新数据的场景,下面看一个具体案例。

1
2
3
4
5
6
7
db.getCollection("comment").find({
nick: "BA_NANA"
}).forEach(function(item) {
item.nick = item.nick.replace('BA_NANA', "扎克蕉");
item.mail = item.mail.replace('old@qq.com', "new@qq.com");
db.getCollection("comment").save(item);
});

上面的操作将会寻找集合名为comment且nick字段为BA_NANA的数据,然后使用forEach遍历替换数据(nick字段BA_NANA替换成扎克蕉,mail字段old@qq.com替换成new@qq.com)。